mysql主从搭建

  1. # 1 主从同步的流程或原理
  2. 1master会将变动记录到二进制日志里面;
  3. 2master有一个I/O线程将二进制日志发送到slave;
  4. 3) slave有一个I/O线程把master发送的二进制写入到relay日志里面;
  5. 4slave有一个SQL线程,按照relay日志处理slave的数据;
  6. # 2
  7. # 3 修改配置文件
  8. ####主库的配置文件,server-id和开启binlog日志
  9. [mysqld]
  10. user=mysql
  11. character-set-server=utf8
  12. default_authentication_plugin=mysql_native_password
  13. secure_file_priv=/var/lib/mysql
  14. expire_logs_days=7
  15. sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  16. max_connections=1000
  17. server-id=100
  18. log-bin=mysql-bin
  19. [client]
  20. default-character-set=utf8
  21. [mysql]
  22. default-character-set=utf8
  23. #############从库的配置
  24. ####主库的配置文件,server-id和开启binlog日志
  25. [mysqld]
  26. user=mysql
  27. character-set-server=utf8
  28. default_authentication_plugin=mysql_native_password
  29. secure_file_priv=/var/lib/mysql
  30. expire_logs_days=7
  31. sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  32. max_connections=1000
  33. server-id=101
  34. log-bin=mysql-slave-bin
  35. relay_log=edu-mysql-relay-bin
  36. [client]
  37. default-character-set=utf8
  38. [mysql]
  39. default-character-set=utf8
  40. # 4 拉起两个mysql容器
  41. #启动主库容器(挂载外部目录,端口映射成33307,密码设置为123456)
  42. docker run -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 33307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  43. #启动从库容器(挂载外部目录,端口映射成33306,密码设置为123456)
  44. docker run -di -v /home/mysql2/data/:/var/lib/mysql -v /home/mysql2/conf.d:/etc/mysql/conf.d -v /home/mysql2/my.cnf:/etc/mysql/my.cnf -p 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  45. #5 创建test用户,并授权
  46. #在主库创建用户并授权
  47. ##创建test用户
  48. create user 'test'@'%' identified by '123';
  49. ##授权用户
  50. grant all privileges on *.* to 'test'@'%' ;
  51. ###刷新权限
  52. flush privileges;
  53. #查看主服务器状态(显示如下图)
  54. show master status;
  55. # 可以看到日志文件的名字,和现在处在哪个位置
  56. #6 连接从库,配置连接主库
  57. #连接从库
  58. mysql -h 172.16.209.100 -P 33306 -u root -p123456
  59. #配置详解
  60. /*
  61. change master to
  62. master_host='MySQL主服务器IP地址',
  63. master_user='之前在MySQL主服务器上面创建的用户名',
  64. master_password='之前创建的密码',
  65. master_log_file='MySQL主服务器状态中的二进制文件名',
  66. master_log_pos='MySQL主服务器状态中的position值';
  67. */
  68. #命令如下
  69. change master to master_host='101.133.225.166',master_port=33307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;
  70. #启用从库
  71. start slave;
  72. #查看从库状态(如下图)
  73. show slave status\G;
  74. ####这两个是yes表示配成功
  75. Slave_IO_Running: Yes
  76. Slave_SQL_Running: Yes
  77. # 7 测试
  78. #在主库上创建数据库test1
  79. create database test1;
  80. use test1;
  81. #创建表
  82. create table tom (id int not null,name varchar(100)not null ,age tinyint);
  83. #插入数据
  84. insert tom (id,name,age) values(1,'xxx',20),(2,'yyy',7),(3,'zzz',23);

django实现读写分离

#1  在setting中配置
DATABASES = {
    # 主库
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'lqz1',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '101.133.225.166',
        'PORT': 33307,
    },
    # 从库
    'db1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'lqz1',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '101.133.225.166',
        'PORT': 33306,
    },
}

# 2 手动指定
    ####手动来做
    # 向default库写,主库
    # res=models.Book.objects.using('default').create(name='金瓶梅',price=33.4)
    # 去从库查
    # res=models.Book.objects.using('db1').all().first()
    # print(res.name)

# 3 自动指定(写router和配置setting)
    class Router1:
    def db_for_read(self, model, **hints):
        return 'db1'
    def db_for_write(self, model, **hints):
        return 'default'

    # 在setting中注册
    # 注册一下
    DATABASE_ROUTERS = ['db_router.Router1',]
# 4 以后只要是写操作,就会用default,只要是读操作自动去db1



分库分表
# 5 更细粒度()
class Router1:
    def db_for_read(self, model, **hints):
        if model._meta.model_name == 'book':
            return 'db1'
        else:
            return 'default'

    def db_for_write(self, model, **hints):
        return 'default'

# 6 在数据库迁移时,可以指定把哪个app的表结构迁移到哪个库
python manage.py migrate app01 --database=default