mysql主从搭建
目录
- mysql主从搭建
- django实现读写分离
- 远程连接linux
- 远程连接docker开发
mysql主从搭建
# 项目只有一个数据库服务端
-无论写还是读,请求都压在这个mysql服务器上
-连接数过高,mysql顶不住
-假设做成两台,一台只用来写数据,另一台用来读数据 -必须要保证两个服务的数据实时同步
-主库和从库
-主库用来写,从库用来读,只需要做好主从同步,就能保证数据的准确
-一主一从
-一主多从
-项目中最多,最影响效率的其实是查,把查分散出去,压力小很多
# 主从配置原理
1)master(主库)会将变动记录到二进制日志(binlog)里面;
2)slave有一个I/O线程将二进制日志拉取;
3)slave有一个I/O线程把master的二进制写入到relay日志里面;
4)slave有一个SQL线程,按照relay日志回放自己的库中
搭建步骤
# 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.205 -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.205 -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 测试
-主库写
-从库读
django实现读写分离
# django操作主从库
-写数据写到主库
-读数据从从库读
# 使用步骤
#1 修改配置文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'wjl', # 数据库名字
'USER': 'root', # 用户名
'PASSWORD': '123456',
'HOST': '10.0.0.200',
'PORT': 33307
},
'db01': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'wjl', # 数据库名字
'USER': 'root', # 用户名
'PASSWORD': '123456',
'HOST': '10.0.0.200',
'PORT': 33306
}
}
# 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']
远程连接linux
# 开发用win,上线基本都用linux
# 有的模块,在win用好好的,linux装不了
# 使用pycharm开发,写代码在win上,但是运行代码,在linux上,运行的结果再返回回来
-本质:win中得pycharm上的python解释器,使用的是虚拟机上的解释器
步骤流程图:
D:\python课堂笔记整理\mysql主从搭建\assets
远程连接docker开发
# 运行客户端[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
补充
# 代码很容易泄露,如何保证python代码不泄露
-项目部署完了,直接源代码删除
-pyinstaller :win上的可执行文件
linux 上的可执行
-把代码做到docker中,每次运行容器都要先鉴权
docker run -id -p 8080:8080 -e secret=sdfasdf django_books
settings.py
resrequest.get('http:www.liuqinzheng.top/veryfy=%s'%os.environ.get('secret'))
-go
# 统计每次被访问次数最多的10个接口
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库