Ubuntu中Mysq数据库配置主从同步实现Django项目的读写分离详细教程

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']

以上就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值