1 服务器结构
角色 | ip地址 | 安装教程 |
---|---|---|
主节点 | 192.168.31.102 | CentOS-7 安装 MariaDB-10.8 |
从节点 | 192.168.31.103 |
2 原理:
原理:
(1)master服务器将数据的改变记录到二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
也就是说:
-
从库会生成两个线程,一个I/O线程,一个SQL线程;
-
I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
-
主库会生成一个log dump线程,用来给从库I/O线程传binlog;
-
SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
简言之可分为下面几个步骤:
- 主库的更新事件会被写到bin log日志中。
- 从库启用slave服务,发起连接,连接到主库。
- 从库创建一个I/O线程,从主库读取bin log日志的内容并写入到relay log日志中。
- 从库创建一个SQL线程,从relay log里面读取内容,将更新内容写入到从库。
3. 编辑MySQL主服务器上的/etc/my.cnf,
[mysqld]
# 启用二进制日志
log-bin=didiok-mysql-bin
# 服务器唯一ID,一般为了方便可取IP最后一段
server-id=102
# 选择 ROW 模式
binlog-format=ROW
log-bin
:MySQL的bin-log的名字server-id
: MySQL实例中全局唯一,并且大于0。
4.在MySQL主节点上创建用于备份的账号
重启 MariaDB 之后,进入 MariaDB,创建新账号:
#此时创建了名为repl的用户,密码为password,% 表示任意地址都可远程登录。
mariadb> CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
#给repl用户授权同步复制权限(REPLICATION SLAVE)
mariadb> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mariadb> flush privileges;
查询master的状态
mariadb> show master status;
5.编辑 MySQL 从服务器上的 /etc/my.cnf,
[mysqld]
server-id=103
server-id
: MySQL实例中全局唯一,并且大于0。与主服务器上的 server-id
区分开。
修改UUID:
使用命令 find / -name auto.cnf
找到auto.cnf文件,修改里面的uuid值,保证各个主从的uuid不一样,重启数据库即可
或者直接删除UUID文件,即auto.cnf ,重新启动服务。
如果找不到可以忽略。
6. MySQL主节点上新增数据
新建数据库didiok
,并在数据库中创建表users
,并在 users
表中新增一条数据:
7.MySQL主节点上加锁,阻止所有的写入操作
mariadb> FLUSH TABLES WITH READ LOCK;
8.MySQL主节点上,查看bin-log的文件名和位置
mariadb> SHOW MASTER STATUS;
对于上文中的file
和 position
的值要记录一下,后面要用到。
9.MySQL主节点上dump所有数据
mysqldump --all-databases --master-data > dbdump.db -uroot -p
mysqldump
方式的优点是可以进行部分复制,如在配置文件中定义 replicate-do-table=db1.*
,则用这种方法可以只复制db1
库而忽略其它复制事件。缺点是由于mysqldump
会生成主库转储数据的SQL
语句,实际是一种逻辑备份方式所以速度较慢,不适用于大库。
10.MySQL主节点进行解锁,解锁后,主节点上可以写入数据
mariadb> UNLOCK TABLES;
11.MySQL从节点上导入之前dump的数据
主节点上执行:
# 主库复制数据到从库
find / -name dbdump.db
cd /root
scp dbdump.db root@192.168.31.103:/root/ #从库的数据文件路径
从节点上执行:
mysql < dbdump.db -uroot -p
之后查看从节点上数据库中是否有users表,表中是否有数据:
12.MySQL从节点上配置主从连接信息
命令格式:
mariadb> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_PORT=port_num,
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
实际执行命令如下
CHANGE MASTER TO MASTER_HOST='192.168.31.102', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='didiok-mysql-bin.000001', MASTER_LOG_POS=890;
- MASTER_HOST: MySQL主的地址
- MASTER_PORT: MySQL主节点的端口(无引号)
- MASTER_USER: 备份账户的用户名
- MASTER_PASSWORD: 备份账户的密码
- MASTER_LOG_FILE:bin-log的文件名
- MASTER_LOG_POS: bin-log的位置(数字型),是show master status 中看到的position的值
bin-log的文件名和位置 是 步骤 8 中的 show master status
得到的。
13.MySQL从节点上开启同步
mariadb> START SLAVE;
查看MySQL从节点的状态
mariadb> show slave status \G
查看Slave_IO_Running
和Slave_SQL_Running
是否成功,只有 这两个状态 都是 YES才可以复制。
14 验证是否同步成功
在主数据上操作,从数据库中查看,截图如下:
附:
============== MariaDB 主节点上可能的 /etc/my.cnf 配置如下 =============
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
server_id = 102 # 一组主从组里的每个id必须是唯一值。推荐用ip位数
log-bin=mysql-bin # 二进制日志,后面指定存放位置。如果只是指定名字,默认存放在/var/lib/mysql下 如果修改的话需要在修改之后赋mysql账号文件夹权限
lower_case_table_names=1 # 不区分大小写
binlog-format=ROW # 二进制日志文件格式
log-slave-updates=True # slave更新是否记入日志
sync-master-info=1 # 值为1确保信息不会丢失
slave-parallel-threads=3 #同时启动多少个复制线程,最多与要复制的数据库数量相等即可
binlog-checksum=CRC32 # 效验码
master-verify-checksum=1 # 启动主服务器效验
slave-sql-verify-checksum=1 # 启动从服务器效验
bind-address = 192.168.31.102 # 监听本机网卡ip
expire_logs_days = 5 # 配置定时清理
binlog-ignore-db=mysql # 设置不要复制的数据库
binlog-ignore-db=infomation_schema
binlog-do-db=blade # 设置需要复制的数据库
============== MariaDB 从节点上可能的 /etc/my.cnf 配置如下 =============
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
server_id=103
log-bin=mysql-bin #log-bin是二进制文件
relay_log=relay-bin # 中继日志, 后面指定存放位置。如果只是指定名字,默认存放在/var/lib/mysql下
lower_case_table_names=1
微信公众号:JavaZhiZhe,欢迎关注: