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. #1 在setting中配置
  2. DATABASES = {
  3. # 主库
  4. 'default': {
  5. 'ENGINE': 'django.db.backends.mysql',
  6. 'NAME': 'lqz1',
  7. 'USER': 'root',
  8. 'PASSWORD': '123456',
  9. 'HOST': '101.133.225.166',
  10. 'PORT': 33307,
  11. },
  12. # 从库
  13. 'db1': {
  14. 'ENGINE': 'django.db.backends.mysql',
  15. 'NAME': 'lqz1',
  16. 'USER': 'root',
  17. 'PASSWORD': '123456',
  18. 'HOST': '101.133.225.166',
  19. 'PORT': 33306,
  20. },
  21. }
  22. # 2 手动指定
  23. ####手动来做
  24. # 向default库写,主库
  25. # res=models.Book.objects.using('default').create(name='金瓶梅',price=33.4)
  26. # 去从库查
  27. # res=models.Book.objects.using('db1').all().first()
  28. # print(res.name)
  29. # 3 自动指定(写router和配置setting)
  30. class Router1:
  31. def db_for_read(self, model, **hints):
  32. return 'db1'
  33. def db_for_write(self, model, **hints):
  34. return 'default'
  35. # 在setting中注册
  36. # 注册一下
  37. DATABASE_ROUTERS = ['db_router.Router1',]
  38. # 4 以后只要是写操作,就会用default,只要是读操作自动去db1
  39. 分库分表
  40. # 5 更细粒度()
  41. class Router1:
  42. def db_for_read(self, model, **hints):
  43. if model._meta.model_name == 'book':
  44. return 'db1'
  45. else:
  46. return 'default'
  47. def db_for_write(self, model, **hints):
  48. return 'default'
  49. # 6 在数据库迁移时,可以指定把哪个app的表结构迁移到哪个库
  50. python manage.py migrate app01 --database=default