Ubuntu中实现Mysq数据库主从同步
1.由于在ubuntu中已经有安装一台mysql了,需要使用docker容器运行相同版本的mysql,现在使用docker安装另外一台mysql:
docker image pull mysql:5.7.22
如果你已有压缩包,可以直接进行解压安装:
docker load -i mysql_docker_5722.tar
2 .由于docker容器只负责运行,因此我们需要将保存mysql数据的路径映射到你当前的宿主机内,在家目录中创建mysql_slave目录,然后cd进入mysql_slave目录,再创建data目录,当你使用docker容器运行mysql保存数据时就映射在此目录中。
mkdir mysql_slave
cd mysql_slave
mkdir data
3.使用cp命令将Ubuntu中的mysql配置文件复制到当前目录中, -r代表目录
cp -r /etc/mysql/mysql.conf.d ./
4.修改配置文件,如果使用docker容器运行mysql会出现端口重复的问题,因此需要对配置文件进行修改:主要修改端口号,和关闭日志文件(之前在配置文件中开启了日志文件,此处由于运行在docker容器中,不需再开启),以及最重要的server-id,既然是主从,server-id肯定不能相同。
port = 8306 #端口号只要不是3306就行,但为避免已经使用尽量改大一点
general_log = 0 #1代表开启,0代表关闭
server-id = 2 #修改为不为1的数字即可
编辑完成后,按下esc,:x 保存退出。
5.接下来,创建docker容器,让此台mysql运行在8306端口上,且编号为2
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
docker run代表创建一个容器,--name mysql-slave代表容器名为:mysql-slave,-e代表传递创建密码的数,MYSQL_ROOT_PASSWORD=mysql,设置数据库密码为mysql,-d代表以后台进程的方式运行,--network=host代表允许以网络方式进行通信,-v后面跟的路径代表你映射到保存数据的目录,第二个-v是映射配置文件,最后的mysql :5.7.22
使用命令查看mysql_slave已经运行起来:
在ubuntu中使用mysql命令尝试连接docker容器中的mysql
mysql -uroot -pmysql -h 127.0.0.1 --port=8306
show databases;
6.由于Ubuntu中主数据库原来已经存在了许多数据,而从数据库才刚进行创建,为了达到主从同步,需要先进行冷备份,即
在Ubuntu中主数据库中使用mysqldump进行数据备份并还原到从服务器以实现数据的复制。
#--all-databases代表所有的数据库,--lock-all-tables代表数据备份未完成,锁住所有的表
# >代表导出,后面的文件名可以自己定义
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql
7.进行导入数据,可以在新开一个终端,执行命令,将数据导入运行在docker容器中的数据库,出现的警告是提示你显示的将密码输入;
mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql
再使用命令 mysql -uroot -pmysql -h127.0.0.1 --port=8306 进入到docker容器中的数据库,show databases; 可以看到所有数据库和表都有了,这样数据就一致了。
8.接下来也是最重要的,让两个数据库开始实时进行同步:编辑设置mysqld的配置文件,设置log_bin和server-id,
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
重启mysql服务
sudo service mysql restart
登入主服务器Ubuntu中的mysql,创建用于从服务器同步数据使用的帐号,帐户名为slave,密码也是slave,
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave';
FLUSH PRIVILEGES;
获取主服务器的二进制日志信息,使用 show master status 查看下面两个参数,从服务器需要使用到File,Position这两个参数,需要暂时记录或保存。
接下来是在docker中的从数据库,进入docker中的mysql,然后执行下面命令:,注意:master_log_file,和master_log_pos需要分别替换为上面的两个参数File和Position,
change master to master_host='127.0.0.1', master_user='slave', master_password='slave',master_log_file='mysql-bin.000151', master_log_pos=590;
启动slave服务器,并查看同步状态
start slave;
show slave status \G
查看两个标红线的参数都是Yes说明主从已经配置成功了,如果你还有疑问,可以自行测试。
Django项目实现读写分离:
1.首先在Django的配置文件中,添加slave数据库信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '10.211.55.5',
'PORT': 3306,
'USER': 'meiduo',
'PASSWORD': 'meiduo',
'NAME': 'meiduo_mall'
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '10.211.55.5',
'PORT': 8306,
'USER': 'root',
'PASSWORD': 'mysql',
'NAME': 'meiduo_mall'
}
}
2.创建数据库操作的路由分发类,在项目的工具包utils下创建,utils中创建db_router.py
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
3.配置读写分离路由
# 配置读写分离
DATABASE_ROUTERS = ['项目名(包含子应用的).utils.db_router.MasterSlaveDBRouter']
以上就完成了。