本文的示例代码参考replication/delay.py
目录
容器
docker run --name mysql-master -p 4406:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.17
docker run --name mysql-slave -p 4407:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.17
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
# 172.17.0.2
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-slave
# 172.17.0.3
主从
主数据库
docker cp mysql-master:/etc/mysql/mysql.conf.d/mysqld.cnf ~/Downloads/mysqld-master.cnf
vim ~/Downloads/mysqld-master.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
## 设置server_id,一般设置为IP,同一局域网内注意要唯一
server_id=100
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=edu-mysql-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
docker cp ~/Downloads/mysqld-master.cnf mysql-master:/etc/mysql/mysql.conf.d/mysqld.cnf
docker restart mysql-master
docker exec -i mysql-master mysql -uroot -p123456 <<< "CREATE USER 'slave'@'%' IDENTIFIED BY '123456';"
docker exec -i mysql-master mysql -uroot -p123456 <<< "GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';"
从数据库
docker cp mysql-slave:/etc/mysql/mysql.conf.d/mysqld.cnf ~/Downloads/mysqld-slave.cnf
vim ~/Downloads/mysqld-slave.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
## 设置server_id,一般设置为IP,注意要唯一
server_id=101
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=edu-mysql-slave1-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## 防止改变数据(除了特殊的线程)
read_only=1
docker cp ~/Downloads/mysqld-slave.cnf mysql-slave:/etc/mysql/mysql.conf.d/mysqld.cnf
docker restart mysql-slave
主从复制
docker exec -i mysql-master mysql -uroot -p123456 <<< "SHOW master status;"
# File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set
# edu-mysql-bin.000002 617 mysql
docker exec -i mysql-slave mysql -uroot -p123456 <<< "change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='edu-mysql-bin.000002', master_log_pos=617, master_connect_retry=30;"
docker exec -i mysql-slave mysql -uroot -p123456 <<< "start slave"
docker exec -i mysql-slave mysql -uroot -p123456 <<< "SHOW slave status \G;" | grep "Running:"
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes
延时
docker exec -i mysql-master mysql -uroot -p123456 <<< "CREATE DATABASE test;"
docker exec -i mysql-master mysql -uroot -p123456 <<< "SHOW DATABASES;" | grep test
# test
docker exec -i mysql-slave mysql -uroot -p123456 <<< "SHOW DATABASES;" | grep test
# test
vim delay.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import pymysql
import time
create_table_sql = """
CREATE TABLE users(
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) UNIQUE,
nickname VARCHAR(255) NOT NULL
)
"""
insert_table_sql = """
INSERT INTO users(username, nickname)
VALUES(%s,%s)
"""
query_table_sql = """
SELECT COUNT(*) FROM users
"""
master = pymysql.connect(host='127.0.0.1', user='root',
passwd='123456', db='test', port=4406, charset='utf8')
master_cursor = master.cursor()
slave = pymysql.connect(host='127.0.0.1', user='root',
passwd='123456', db='test', port=4407, charset='utf8')
slave_cursor = slave.cursor()
master_cursor.execute('DROP TABLE IF EXISTS users')
master_cursor.execute(create_table_sql)
master.commit()
# 等待主从同步表
time.sleep(5)
# 主数据库插入数据
master_cursor.execute(insert_table_sql, ('username1', 'nickname1'))
master.commit()
# # 从数据库读取数量
slave_cursor.execute(query_table_sql)
print('count = ' + str(slave_cursor.fetchone()))
python --version # Python 3.5.2
python delay.py # count = (0,)
结论: 主从复制有一定的数据延时
网友评论