1 什么是主从
主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。
2 主从解决的问题
1.通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
2.提高数据安全-因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据。
3.在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能。
3 主从原理
1.每个从仅可以设置一个主。
2.主在执行SQL之后,记录二进制log文件(bin-log)。
3.从连接主,并从主获取bin-log,存于本地relay-log,并从上次记住的位置起执行SQL,一旦遇到错误则停止同步。
4 配置步骤
配置-主
1.创建一个用户,并给予权限
mysql> create user `dark`@`%` identified by "root";
mysql> grant all on *.* to `dark`@`%` with grant option;
2.开启binlog日志
在/etc/my.cnf文件的[mysqld]下写入如下:
log-bin=mysql-bin
binlog_format=mixed
server-id = 1
配置-从
1.修改server_id
server_id = 2
2.配置主从
change master to master_host="192.168.63.123",master_port=3306,master_user=root,master_password=root,master_log_file="mysql-bin.000001",master_log_pos=4
5 实践
1.进入主容器(主mysql默认搭建完成),查看相关信息
查看用户信息
mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| dark | % | mysql_native_password |
| root | % | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)
查看bin-log信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 321925 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2.创建相关配置文件目录,修改配置文件
cp /etc/my.cnf /docker/mysql-slave1/conf/
cp /etc/my.cnf /docker/mysql-slave2/conf/
修改两个配置文件的端口分别为3307、3308,以及server-id = 2、server-id = 3
3.创建两个容器
docker run -p 3307:3307 -d --name mysql-slave1 -v /docker/mysql-slave1/conf/my.cnf:/etc/mysql/my.cnf --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql
docker run -p 3308:3308 -d --name mysql-slave2 -v /docker/mysql-slave2/conf/my.cnf:/etc/mysql/my.cnf --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql
4.从,相关配置
进入容器salve1,进行相关配置
mysql>change master to master_host="172.17.0.4",master_port=3306,master_user="dark",master_password="root",master_log_file="mysql-bin.000003",master_log_pos=321925;
mysql> start slave;
mysql> show slave status\G;
slave2和上述配置相同,不再赘述。
在主中新建数据库,查看从是否会同步。
mysql> create database lmrs_users;
Query OK, 1 row affected (0.00 sec)
slave1
slave2
6 mycat配置主从
<dataHost name="lmrs_order" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.35.139:3306" user="root" password="root">
<readHost host="hostS2" url="192.168.35.139:3307" user="root" password="root"/>
<readHost host="hostS3" url="192.168.35.139:3308" user="root" password="root"/>
</writeHost>
</dataHost>
如果
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: No
可能是数据库主从发生了故障
解决方法:
1、先停止同步:mysql>stop slave;
2、使用命令:mysql>set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
3、开启同步:mysql>start slave;
4、使用命令:mysql>show slave status\G,查看Slave_SQL_Running的值,如果不为Yes,则重复上述3步,直到为Yes
网友评论