1.主从分离
为了提高MySQL的性能,一般会选择使用多个MySQL同时工作,分为主服务器和从服务器,一台主服务器对应多台从服务器
主从同步是基于二进制日志机制的,主服务器将数据变动的情况写进二进制日志,从服务器读取该日志并且执行该日志文件使数据保持一致
优点
- 提高读写性能
数据写入和读取是在不同的服务器上进行的,而且可以通过增加从服务器来提高数据库的读取性能 - 提高数据安全
因为数据已复制到从服务器,可以在从服务器上备份而不破坏主服务器相应数据
2.配置步骤
2.1 下载MySQL的docker镜像
# 使用docker加载MySQL镜像
docker image load -i mysql_docker_5722.tar
# 删除以前配置的文件夹
sudo rm -r ~/mysql_slave/
# 复制已有服务器的配置
sudo mkdir ~/mysql_slave/
sudo mkdir ~/mysql_slave/data/
sudo cp -r /etc/mysql/mysql.conf.d ~/mysql_slave/
2.2 修改从服务器的配置
cd ~/mysql_slave
sudo vim mysql.conf.d/mysqld.cnf
- 34行port改成8306,从服务器端口号与主服务器不同即可
- 70行general_log改成0,关闭日志,从服务器不记录日志信息
- 84行serverce-id改成2,从机唯一编号与服务器不同即可
2.3 把MySQL镜像运行成容器
# 移除已存在的容器(如果有的话)
sudo docker container rm -f mysql-slave
sudo docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d --network=host -v /home/python/mysql_slave/data:/var/lib/mysql -v/home/python/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d mysql:5.7.22
注意:上面的代码从服务器的root使用的密码是123456
2.4 配置主从同步
打开MySQL服务的配置文件,
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
取消注释69、70行,开启日志
69 general_log_file = /var/log/mysql/mysql.log
70 general_log = 1
保存退出后重启服务器
sudo /etc/init.d/mysql restart
2.5 同步数据
导出主服务器已存在的数据并且导入到从服务器
# 从主服务器导出数据
mysqldump -uroot -pmysql --all-databases --lock-all-tables >~/master_db.sql
# 导入到从服务器
mysql -uroot -p123456 -h127.0.0.1 --port=8306 < ~/master_db.sql
2.6 新建账号
在主服务器新建一个账号,给从服务器用
# 登录主服务器
mysql -uroot -pmysql
# 新建账号
grant replication slave on *.* to 'slave'@'%'identified by 'slave';
# 刷新权限
flush privileges;
# 查看二进制日志文件的信息
show master status;
可以看到主服务器的File和Position两个字段的值,下面会用到
2.6 指定从服务器同步主服务器
# 打开一个新终端,登录从服务器
mysql -uroot -p123456 -h127.0.0.1 --port=8306
# 指定主服务器和日志文件,注意修改日志文件名和位置
change master to master_host='127.0.0.1',
master_user='slave',master_password='slave',
master_log_file='mysql-bin.000245', master_log_pos=730;
# 开启从服务器
start slave;
# 查看状态
show slave status \G;
注意:master_log_file和master_log_pos这两个值是上面查看主服务器status显示的
3.配置Django的读写分离
3.1 修改settings配置文件
DATABASES = {
# 默认服务器(主服务器)
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'HOST': '192.168.203.153', # 数据库主机
'PORT': 3306, # 数据库端口
'USER': 'root', # 数据库用户名
'PASSWORD': 'mysql', # 数据库用户密码
'NAME': 'ihome' # 数据库名字
},
# 从服务器
'slave': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '192.168.203.153',
'PORT': 8306, # 数据库端口
'USER': 'root',
'PASSWORD': '123456', # 密码
'NAME': 'ihome'
}
}
# 指定Django数据库读写路由
DATABASE_ROUTERS = [
'ihome.utils.db_router.MasterSlaveDBRouter'
]
3.2 新建一个py文件控制读写路由
ihome/utils/db_router.py
class MasterSlaveDBRouter(object):
def db_for_read(self, model, **hints):
# 返回slave配置 --> 指向从mysql
print('从服务器读取')
return 'slave'
def db_for_write(self, model, **hints):
# 返回default配置 --> 指向主mysql
print('主服务器写入')
return 'default'
def allow_relation(self, obj1, obj2, **hints):
"""是否运⾏关联操作"""
return True
4.测试读写分离
1.打开Django的shell
python manage.py shell
2.验证读写数据
from users.models import User
User.objects.get(pk =1)