在ubuntu使用docker配置mysql主从同步 搭建读写分离

      主从概念
            首先需要配置两个mysql数据库,一个是本机下的主机Master,另外一个从机Slave
            master拥有一个Binarylog日志,slave则为Relay日志
            binarylog日志通过发送一个Io线程发送更改后的数据,relaylog接收到后更新slave库的数据

  1. 在ubuntu中安装mysql从机

    1. 获取MySQL镜像

      $ sudo docker image pull mysql:5.7.22$ sudo docker load -i 文件路径/mysql_docker_5722.tar
      
    2. 指定mysql从机配置文件

      $ cd ~
      $ mkdir mysql_slave			#创建mysql_slave文件
      $ cd mysql_slave			#进入
      $ mkdir data				#创建data文件
      $ cp -r /etc/mysql/mysql.conf.d ./		将这个目录下的文件复制到当前文件
      $ cd mysql.conf.d		#进入
      $ vim mysqld.cnf		#进入
      
    3. 修改mysql从机配置文件

      # 从机端口号
      port = 8306
      # 关闭日志
      general_log = 0
      # 从机唯一编号
      server-id = 2
      
    4. 安装运行mysql从机

      $ sudo 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
      
    5. 测试是否启动成功

      $ mysql -uroot -p -h 127.0.0.1 --port=8306
      
      #注意不要在-p后面输入密码会报警告
      #从库密码在上面启动时设置的为mysql
      
    6. docker

      docker container ls      查看运行镜像
      docker container ls -a   #查看所有镜像
      docker container stop 镜像名      #停止镜像
      docker container rm 镜像名      #删除镜像
      docker container start 镜像名      #启动镜像
      
      
      
      #注意不要在-p后面输入密码会报警告
      #从库密码在上面启动时设置的为mysql
      
  2. 从库在docker中配置好后开始实现主从同步

    1. 配置主机(ubuntu的MySQL)

      • 如果需要修改配置的话需要重启主机
      # 开启日志
      general_log_file = /var/log/mysql/mysql.log
      general_log = 1
      # 主机唯一编号
      server-id = 1
      # 二进制日志文件
      log_bin = /var/log/mysql/mysql-bin.log
      
    2. 从机备份主机原有数据

      # 1. 收集主机原有数据
      $ mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql
      
      # 2. 从机复制主机原有数据
      $ mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql
      
    3. 主从同步实现

      • 1.创建用于从服务器同步数据的帐号
      # 登录到主机
      $ mysql –uroot –pmysql
      # 创建从机账号
      $ GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave';
      # 刷新权限
      $ FLUSH PRIVILEGES;
      
      • 2.展示ubuntu中MySQL主机的二进制日志信息
      $ SHOW MASTER STATUS;
      
      • 3.Docker中MySQL从机连接ubuntu中MySQL主机
      # 登录到从机
      $ 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.000250', master_log_pos=990250;
      注:其中master_log_file='mysql-bin.后面的数字要跟主库SHOW MASTER STATUS展示的日志File下面数字同步'
      同样master_log_pos=后面的数字要跟主库SHOW MASTER STATUS展示的日志Position下面的数字同步
      表示我要跟主库的那个字节开始同步,否则从库永远不可能跟主库的数据同步!!!
      # 开启从机服务
      $ start slave;
      # 展示从机服务状态
      $ show slave status \G
      

注:搭建的从库不能修改数据

django实现mysql读写分离

1.增加slave数据库的配置

  • settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sjk',
        'USER':'root',
        'PASSWORD':'1',
        'HOST':'192.168.56.100',
        'PORT':'3306'
    },
    'slave': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'sjk',
            'USER':'root',
            'PASSWORD':'1',
            'HOST':'192.168.56.100',
            'PORT':'8306'
        }
}

2.创建utils包创建db_router设置

  • 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.将创建的类方法导入进settings.py

  • settings.py

    DATABASE_ROUTERS = ['utils.db_router.MasterSlaveDBRouter']
    
posted @   比啾比啾  阅读(95)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示