一。 Mysql 主从同步
1.1定义:实现数据自动同步的服务结构,结构分为2种角色
主服务器:接受客户端访问的数据库服务器
从服务器:自动从主库服务器同步数据到本机的数据库服务器
2.2:原理:
I/O线程: 复制master主机的binlog日志文件里的SQL到本机的relay-log文件里
SQL线程:执行本机relay-log文件里的sql语句,重现master的数据操作
3.3配置步骤:
1.3.1服务器的角色:
192.168.4.50 客戶端(client)
192.168.4.51 主(master) 運行數據庫服務器 管理員root 本機能夠登陸
192.168.4.52 從 (slave) 運行數據庫服務器 管理員root 本機能夠登陸
1.3.2.配置主服务器 192.168.4.51
1.启用binlog日志文件
[root@host51 ~]# vim /etc/my.cnf
server_id=51
log-bin=master51
:wq
.[root@host51 ~]# systemctl restart mysqld
.[root@host51 ~]# ls /var/lib/mysql/master51.*
2.用户授权
[root@host51 ~]# mysql -uroot -pabc123
mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
mysql> show master status;
1.3.3:配置从服务器: 192.168.4.52
1.指定server_id
[mysql]
server_id=52
[root@host52 ~]# systemctl restart mysqld
2. 指定主服务器信息:
[root@host52 ~]# mysql -uroot -p123456
mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123qqq...A",master_log_file="master51.000001",master_log_pos=441;
mysql> show slave status\G;
Slave_IO_Running: No # 未开启slave时这两个线程的状态是:no
Slave_SQL_Running: No
3.启动slave进程
mysql> start slave;
4.查看进程信息:
mysql> show slave status\G;
Slave_IO_Running: Yes #这两个线程必须时显示yes
Slave_SQL_Running: Yes
从库的相关文件
cd /var/lib/mysql/
中继日志文件 host52-relay-bin. index 索引文件
host52-relay-bin.编号
主服务器的信息: maste.info
中继日志文件信息:relay-log.info
4.4验证配置:
1 在主服务器添加访问数据的连接用户
mysql> create database db7;
mysql> grant all on db7.* to webuser@"%" identified by "123qqq...A";
2. 在客户端连接主服务器,对数据做操作
[root@host50 admin]# mysql -h192.168.4.51 -uwebuser -p123qqq...A
mysql> create table t1(id int);
mysql> insert into t1 values (10101);
3 在服务机器本机查看是否有和主机服务器的数据一致
二。mysql 主从同步的模式
2.1 mysql 主从同步结构模式
一主一从
一主多从:给当前主服务器51,再配置1台从数据库服务器53
1在服务机器53上运行mysql服务且管理员能够本机登陆
2.在没有配置从服务机器53之前,要有主服务器上的数据:
[root@host51 ~]# mysqldump -uroot -pabc123 db7 > /root/db7.sql
[root@host51 ~]# scp /root/db7.sql root@192.168.4.53:/root
mysql> create database db7;
mysql> use db7;
mysql> source /root/db7.sql;
3.设置主机53的server_id
[root@host53 ~]# vim /etc/my.cnf
server_id=53
4指定主服务器的信息:
[root@host53 ~]# mysql -h192.168.4.51 -urepluser -p123qqq...A #测试在之前在51主机里面添加用户权限能否登陆
mysql>exit
[root@host53 ~]# mysql -uroot -p123456
mysql>exit
mysql> change master to
master_host="192.168.4.51",
master_user="repluser",
master_password="123qqq...A",
master_log_file="master51.000001",
master_log_pos=1817;
5.启动slave进程
mysql> start slave;
6.查看进程信息:
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
7.客户端的测试:
1.在客户端50主机连接主数据库服务齐访问数据
[root@host50 ~]# mysql -h192.168.4.51 -uwebuser -p123qqq...A
mysql> insert into t1 values(88);
mysql> select * from t1;
mysql> create table t2(name char(10));
mysql> insert into t2 values("bob");
2.分别在2台从服务器本机查看数据(可以看到和主服务器一样的数据)
[root@host52 mysql]# mysql -uroot -p123456;
mysql> select * from db7.t1;
mysql> select * from db7.t2
主从从
给当前的从服务器52配置一台从服务器192.168.4.54
1配置52
1.1 启用binlog日志
[root@host52 mysql]# vim /etc/my.cnf
log_bin=master52 启用binlog日志
log_slave_updates # 启用链式复制
[root@host52 mysql]systemctl restart mysql # 重启动mysql
1.2 用户授权
mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
1.3 查看binlog日志信息
mysql> show master status;
2 配置54
在没有配置从服务机器54之前,要有主服务器上的所有数据数据:
主机 52上面的操作: [root@host52 mysql]# mysqldump -uroot -p123456 db7 > /root/db7.sql #备份 db7的数据
[root@host52 mysql]# scp /root/db7.sql root@192.168.4.54:/root
在主机 54上面的操作 :mysql> create database db7;
mysql> use db7;
mysql> source /root/db7.sql; # 恢复db7的数据库
2.1指定server_id
[root@host54 mysql]# vim /etc/my.cnf
server_id=54
[root@host54 ~]# mysql -h192.168.4.52 -urepluser -p123qqq...A
2.2 指定主服务器信息
mysql> change master to master_host="192.168.4.52",master_user="repluser",master_password="123qqq...A",master_log_file="master52.000002",master_log_pos=441;
2.3 启动slave 进程
mysql> start slave;
2.4 查看进程信息
mysql> show slave status\G;
3测试配置:
3.1 在客户端连接主服务器51存数据
[root@host50 admin]# mysql -h192.168.4.51 -uwebuser -p123qqq...A
mysql> use db7;
mysql> insert into t1 values(8999);
3.2 在52和54 主机上面查看数据
mysql> select * from db7.t1;
[root@host54 ~]# mysql -uroot -p123456 -e "select * from db7.t1";
主主结构 : 把数据库服务机器55和56 配置为主主结构
2.2 mysql 主从同步复制模式:
异步复制:
全同步复制模式:
半同步复制模式:
案例 : 把数据库服务器52的半同步复制模式
步骤 :
1.查看是否允许动态加载模块
show variables like 'have_dynamic_loading';
2 加载模块
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
3.查看加载信息
- mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
4. 启用模块
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
5 查看啓用信息
mysql> show variables like 'rpl_semi_sync_%_enabled';
6 修改配置文件使其配置永久生效
]# vim /etc/my.cnf
[mysqld]
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
:wq
2.3 mysql 主从同步常用配置选项(/etc/my.cnf)
2.3.1 应用在主服务器上的配置选项
binlog_do_db=数据库名 //只允许同步的库
binlog_ignore_db=数据库名 //不允许同步的库
2.3.2 应用在从服务器上的配置选项
vim /etc/my.cnf
log_slave_updates //记录从库更新,允许链式复制
replicate_do_db=数据库名 //仅同步的库
replicate_Ignore_db=数据库 //只不同步的库
relay_log=日志名 //自定义中继日志文件名