1 mysql主从搭建
# 项目只有一个数据库服务端 -无论写还是读,请求都压在这个mysql服务器上 -连接数过高,mysql顶不住 -假设做成两台,一台只用来写数据,另一台用来读数据 -必须要保证两个服务的数据实时同步 -主库和从库 -主库用来写,从库用来读,只需要做好主从同步,就能保证数据的准确 -一主一从 -一主多从 -项目中最多,最影响效率的其实是查,把查分散出去,压力小很多 # 主从配置原理 1)master(主库)会将变动记录到二进制日志(binlog)里面; 2)slave有一个I/O线程将二进制日志拉取; 3)slave有一个I/O线程把master的二进制写入到relay日志里面; 4)slave有一个SQL线程,按照relay日志回放自己的库中
1.1 搭建步骤
# 1 准备两台机器 ----》docker 容器模拟 -docker pull mysql:5.7 # 2 配置两台机器环境---》创建两个文件夹,做目录映射,一个给主,一个给从 mkdir /home/mysql mkdir /home/mysql/conf.d mkdir /home/mysql/data touch /home/mysql/my.cnf mkdir /home/mysql2 mkdir /home/mysql2/conf.d mkdir /home/mysql2/data touch /home/mysql2/my.cnf # 3 编写mysql 主库的配置文件 ---》重点:server-id 不能重复,开启bin-log日志 [mysqld] user=mysql character-set-server=utf8 default_authentication_plugin=mysql_native_password secure_file_priv=/var/lib/mysql expire_logs_days=7 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION max_connections=1000 server-id=100 log-bin=mysql-bin [client] default-character-set=utf8 [mysql] default-character-set=utf8 # 4 编写mysql 从库配置文件 server-id不能重复,开启log-bin开启 relay_log [mysqld] user=mysql character-set-server=utf8 default_authentication_plugin=mysql_native_password secure_file_priv=/var/lib/mysql expire_logs_days=7 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION max_connections=1000 server-id=101 log-bin=mysql-slave-bin relay_log=edu-mysql-relay-bin [client] default-character-set=utf8 [mysql] default-character-set=utf8 # 5 启动主库和从库 #启动主库容器(挂载外部目录,端口映射成33307,密码设置为123456) 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 #启动从库容器(挂载外部目录,端口映射成33306,密码设置为123456) 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 # 6 远程链接主库 cmd要执行命令 mysql -h 10.0.0.200 -P 33307 -uroot -p #在主库创建用户并授权 ##创建test用户 create user 'test'@'%' identified by '123'; ##授权用户 grant all privileges on *.* to 'test'@'%' ; ###刷新权限 flush privileges; #查看主服务器状态(显示如下图) bin log日志的位置 show master status; # 7 远程链接从库 cmd要执行命令 mysql -h 10.0.0.200 -P 33306 -uroot -p #配置详解 ''' change master to master_host='MySQL主服务器IP地址', master_user='之前在MySQL主服务器上面创建的用户名', master_password='之前创建的密码', master_log_file='MySQL主服务器状态中的二进制文件名', master_log_pos='MySQL主服务器状态中的position值'; ''' #命令如下 change master to master_host='10.0.0.200',master_port=33307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0; #启用从库 start slave; #查看从库状态(如下图) show slave status\G; # 8 测试 -主库写 -从库读
2 django实现读写分离
#1 修改配置文件 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', }, 'db01': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db1.sqlite3', } } # 2 在models.py 中创建表 class Books(models.Model): name = models.CharField(max_length=32) price = models.CharField(max_length=32) # 3 迁移 makemigrations # makemigrations app01 不写表示迁移所有 migrate # migrate --database=db01 把变化迁移到哪些库中,默认迁移到defalut中 # 4 写代码,测试 -新增数据,修改,删除 都是写操作 -查询数据 读操作 -方式一:手动操作,指定哪个库 Books.objects.using('db01') -方式二:自动方式 -在项目路径下编写 app_router.py class DatabaseAppsRouter(object): # 读数据的时候,返回哪个库,它就用哪个库 def db_for_read(self, model, **hints): # 分库分表 id大于10000 写到哪个库中, # 通过model判断是操作哪个表 print(model._meta) return 'db01' def db_for_write(self, model, **hints): return 'default' -配置文件配置,自动读写分离 DATABASE_ROUTERS = ['django_databases.app_router.DatabaseAppsRouter']
3 远程链接linux开发
# 开发用win,上线基本都用linux # 有的模块,在win用好好的,linux装不了 # 使用pycharm开发,写代码在win上,但是运行代码,在linux上,运行的结果再返回回来 -本质:win中得pycharm上的python解释器,使用的是虚拟机上的解释器
4 远程链接docker开发
4.1 搭建步骤
# 运行客户端[pycharm]远程链接docker服务器 # 1 配置运行远程客户端连接docker vim /lib/systemd/system/docker.service # 原来是 # ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock #改成 ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock # 2 /etc/profile 写入 将管理地址写入 /etc/profile 执行命令:echo 'export DOCKER_HOST=tcp://0.0.0.0:2376' >> /etc/profile 执行命令:source /etc/profile #3 重启docker systemctl daemon-reload && systemctl restart docker # 4 测试 # 虚拟机执行 curl 127.0.0.1:2376/version # win执行 http://10.0.0.205:2376/version
标签:bin,log,数据库,master,mysql,home,docker,主从 From: https://www.cnblogs.com/shangxin-bai/p/17007319.html