主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。而redis的读写分离可参考:redis读写分离
主从配置是基于二进制日志来实现的,主服务器在执行增删改查时会将相关指令都记录在二进制日志文件中,然后从服务器通过读取和执行该文件来保持和主服务器一致。
django的配置非常简单,但在这之前先要进行mysql的主从配置。本篇文章以ubuntu为操作系统,其上的mysql为主服务器,然后再用docker来建立mysql从服务器。
ubuntu安装mysql很轻松:
1. sudo apt-get install mysql-server
2. apt-get isntall mysql-client
3. sudo apt-get install libmysqlclient-dev
docker下载mysql镜像(docker的安装可以百度)终端输入:
docker image pull mysql:5.7.22 #因ubuntu用的是5.7版本,所以指定docker的也为5.7
运行mysql docker镜像,需要在宿主机中建立文件目录用于mysql容器保存数据和读取配置文件。
cd
mkdir mysql_slave
cd mysql_slave
mkdir data
cp -a /etc/mysql/mysql.conf.d ./ #将位于/etc的mysql配置文件拷到家目录下
我们要将docker运行的mysql作为slave来运行,开启前需要修改配置文件。编辑 ~/mysql_slave/mysql.conf.d/mysqld.cnf 文件,修改:
port = 8306 #区别开主服务器的3306,定义为8306
general_log = 0
server-id = 2 #主服务器id设为1,从服务器只要不是1都行,这边取2
创建docker容器,要指定ubuntu和docker里面映射的路径(-v后面就是指定的映射路径),详细命令如下:
docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -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
此时尝试链接mysql:
mysql -uroot -p --port=8306
输入密码后能连上,则说明安装成功。接下来备份初始主服务器的内容到从服务器,后续的备份则通过二进制日志来传输:
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql
#上面的命令是将主服务器的所有数据库拷贝出来,下面的命令则是拷贝到docker里面
mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql
接下来配置主服务器的配置:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf #进入配置文件
server-id = 1 #在[mysqld]下方输入这两条指令
log_bin = /var/log/mysql/mysql-bin.log
然后重启mysql:
sudo service mysql restart
接着创建slave使用的账号密码:
mysql –uroot –p #输入密码,进入mysql
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave';
#*.*表示所有表,第一个slave表示账号,第二个slave表示密码
FLUSH PRIVILEGES; #执行权限
获取主服务器的二进制信息:
SHOW MASTER STATUS;
File为使用的日志文件名字,Position为使用的文件位置,这两个参数须记下,配置从服务器时会用到。
进入docker中的mysql配置从服务器的slave:
mysql -uroot -pmysql -h 127.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.000006', master_log_pos=590;
# 依次填入从服务器的账号/密码/日志文件名/文件位置
启动slave服务器,并查看同步状态
start slave;
show slave status \G
DATABASES = {
'default': {
...
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 8306,
'USER': 'root',
'PASSWORD': 'mysql',
'NAME': 'meiduo_mall'
}
}
class MasterSlaveDBRouter(object):
"""数据库主从读写分离路由"""
def db_for_read(self, model, **hints):
"""读数据库"""
return "slave"
def db_for_write(self, model, **hints):
"""写数据库"""
return "default"
def allow_relation(self, obj1, obj2, **hints):
"""是否运行关联操作"""
return True
DATABASE_ROUTERS = ['utils.db_router.MasterSlaveDBRouter']
关于django实现读写分离就写到这了,谢谢观看~