MySQL主從複製 - 延時

本文的示例代碼參考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,)

結論: 主從複製有一定的數據延時

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章