第7章 - 创建复制和定时复制

本文介绍了如何创建数据库副本(Replicas)并实现其间的调度复制(Scheduling Replication),以提高高负载数据库的效率,减轻网络拥堵,并确保即使在服务器故障的情况下也能保持数据库的可用性。此外,还讨论了副本在Web站点管理和设计中的应用。

第7章

创建Replicas和Scheduling Replication

这一章节是解释怎样去创建Replicas和Scheduling Replication。

Replicas

你可以创建Replicas使得用户在不同的地方,不同的网络,不同的时间区域去使用数据库。所有的Replicas都共同分享同一个replica ID, 这个replica ID是数据库创建的时候所赋予的。两个replicas的文件名字可以不同,同时每一个replica可以包含不同的文档或者有不同的design,然而,如果他们的replica ID是相同的话,replication就可以在他们之间发生。

但用户对一个数据库的不同replicas进行增加,修改或删除文档的时候,这些replicas的内容就不再相同。为了确保所有的replicas的内容的同步性,你可以使用Connection document在储存这这些replicas的服务器中运行schedule replication。这样不同的sites, teams, users就可以修改一个数据库和分享这些改变给所有有权限访问的人。另外,使用replicas和scheduling replication可以减少网络的堵塞。用户不需要去连接核心服务器去访问只有一个replica的特定数据库。相反,他们可以在一个或多个服务器中去访问这个数据库的replicas.

这种分布式的replicas也可以用作运行在不同服务器上的Web站点。用户通过Internet去访问特定的应用时,他们不需要去依赖一台服务器。如果一台服务器不可用了,用户也可以访问另外服务器上的数据库replica.你也可以使用replicas去管理进行中的Web站点的design. 在一个服务器上,你可以架起一个Web临时框架区域来进行你的设计和测试。当设计被测试完和准备好做release后,你可以复制这个服务器到那个用户正在使用的服务器上。这样子,你就可以防止Web用户看到你正在工作了。
一个数据库的replica并不等于一个你使用File->Database->Copy而复制出来的数据库。尽管复制出来的数据库看起来跟原本的数据库一摸一样,但是复制品并不能跟原本的数据库分享同一个replica ID,所以也不能与原本的数据库进行复制。

决定什么时候创建replica
小心计划你的replica计划,和只有当你必须的时候才创建replicas。更多的replicas只会导致对服务器更多的需求,更多的网络资源和更多的配置。为了防止不必要的replicas增加,只会对少量的管理员赋以创建Replica服务器的权限。所以如果需要有新的replica,通常告诉用户或者应用开发人员去联系这些管理员。
创建一个数据库有以下有点:
对使用率很高的数据库提升效率;
分散网络的堵塞;
当你进行再次修改版本的时候,保持一个数据库的正式版本;
尽是一个服务器坏了,仍然保持数据库的可用性;
用户通过远程仍然可以使用数据库;
......
需要注意的是,两个replicas之间会存在小小的不一样。如果用户需要从一个数据库中访问最更新的信息,你可以在聚群服务器上创建replicas,然后在集群服务器中建立replication。在一个集群里,所有的replicas总是相一致的,因为每一次的修改都会立刻复制到集群里面的其他服务器上。


<think>我们参考用户提供的站内引用,并结合用户需求(从0到1配置nginx负载均衡mysql主从复制)来组织回答。 注意:用户要求详细步骤,且是“从零开始”,因此我们需要涵盖环境准备、安装、配置、验证等步骤。 根据引用[1],我们得知环境中使用了Docker容器,但用户没有明确要求必须使用Docker,所以我们可以提供两种方式:物理机/虚拟机安装容器安装。不过引用中提到了容器,且用户之前的问题可能涉及容器,因此我们可以以容器环境为例,同时兼顾非容器环境。 引用[3]提供了MySQL安装的部分步骤,但版本较老(mysql80-community-release-el7.rpm),我们将使用较新的方法,但步骤类似。 由于用户需求分为两部分:nginx负载均衡mysql主从复制,我们将分两部分回答。 步骤总体思路: 一、环境准备 二、MySQL主从复制配置 三、Nginx负载均衡配置(用于负载均衡后端Web服务器,这里假设Web服务器已经存在,如引用[1]中的webweb1) 注意:引用[1]中已经给出了容器网络IP规划,我们可以参考这个IP规划。 详细步骤: 第一部分:MySQL主从复制 1. 准备工作(以两个MySQL节点为例,masterslave) - 确保两个MySQL节点之间网络互通(在容器环境中,它们应在同一网络下) - 关闭防火墙或开放MySQL端口(3306) 2. 安装MySQL(在两个节点上执行) - 可以使用Docker容器方式安装,也可以直接在CentOS上安装。 我们以直接在CentOS上安装为例(如果使用容器,步骤类似,但需注意配置文件挂载数据卷): 参考引用[3]的MySQL安装步骤,但注意版本选择: 步骤: a. 下载并安装MySQL官方的Yum Repository(这里以MySQL5.7为例,因为MySQL8.0在权限设置上有些不同,为了简化使用5.7) b. 安装MySQL服务器 c. 启动MySQL服务 具体命令: ```bash # 下载MySQL5.7的Yum源 wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm # 安装Yum源 rpm -ivh mysql57-community-release-el7-11.noarch.rpm # 安装MySQL服务器 yum -y install mysql-community-server # 启动服务 systemctl start mysqld # 设置开机启动 systemctl enable mysqld ``` 3. 配置主服务器(master:192.168.131.201,这里使用引用[1]中的IP) - 修改配置文件(/etc/my.cnf): ``` [mysqld] server-id=201 # 唯一ID,通常用IP最后一段 log-bin=mysql-bin # 启用二进制日志 ``` - 重启MySQL:`systemctl restart mysqld` - 登录MySQL(初始密码在/var/log/mysqld.log中查找,使用`grep 'temporary password' /var/log/mysqld.log`) - 创建复制账号并授权: ```sql mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; mysql> FLUSH PRIVILEGES; ``` - 查看主库状态,记录FilePosition: ```sql mysql> SHOW MASTER STATUS; ``` 4. 配置从服务器(slave:192.168.131.202) - 修改配置文件(/etc/my.cnf): ``` [mysqld] server-id=202 ``` - 重启MySQL:`systemctl restart mysqld` - 登录MySQL,配置主从复制: ```sql mysql> CHANGE MASTER TO MASTER_HOST='192.168.131.201', MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', -- 这里替换为主库状态中的File MASTER_LOG_POS= 位置; -- 替换为主库状态中的Position ``` - 启动复制:`mysql> START SLAVE;` - 检查从库状态:`SHOW SLAVE STATUS\G`,查看Slave_IO_RunningSlave_SQL_Running是否为Yes。 第二部分:Nginx负载均衡配置(以两个Web服务器为例,web:172.18.0.111web1:172.18.0.112) 1. 在nginx1节点(172.18.0.11)上安装Nginx - 安装依赖: ```bash yum install -y gcc pcre-devel zlib-devel openssl-devel ``` - 下载Nginx源码包并编译安装(也可以使用yum直接安装,这里以源码安装为例): ```bash wget http://nginx.org/download/nginx-1.18.0.tar.gz tar zxvf nginx-1.18.0.tar.gz cd nginx-1.18.0 ./configure --prefix=/usr/local/nginx make && make install ``` - 或者使用yum安装(需要先安装epel-release): ```bash yum install -y epel-release yum install -y nginx ``` 2. 配置负载均衡 - 编辑Nginx配置文件(通常为/usr/local/nginx/conf/nginx.conf或/etc/nginx/nginx.conf),在http块中添加: ```nginx upstream backend { server 172.18.0.111:80 weight=1; server 172.18.0.112:80 weight=1; } ``` - 然后在server块中配置: ```nginx server { listen 80; server_name localhost; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` - 重启Nginx:`nginx -s reload` 或 `systemctl reload nginx`(取决于安装方式) 3. 验证 - 在浏览器访问nginx1的IP(172.18.0.11),看请求是否被分发到两个Web服务器。 注意:以上步骤假设Web服务器已经配置好并运行。如果还没有,需要先配置Web服务器(如安装Apache+PHP,如引用[1]所示)。 由于引用[1]中使用了容器,我们也可以提供Docker容器部署的方式,但用户的问题没有明确要求容器,所以我们提供了两种方式(安装部分给出了非容器的,配置部分通用)。如果用户需要容器方式,可以再补充。 但是,为了更贴合引用[1]的环境,我们可以简要说明在容器中如何配置: 对于MySQL主从复制- 使用Docker运行两个MySQL容器,分别命名为mysql-mastermysql-slave,指定网络IP(如引用[1]中的IP)。 - 在启动容器时挂载配置文件(my.cnf)数据目录。 - 配置步骤与上述类似。 对于Nginx负载均衡: - 运行一个Nginx容器,配置负载均衡,将请求代理到webweb1容器(使用容器IP)。 由于用户要求详细步骤,且从零开始,我们已经给出了非容器环境的详细步骤,容器环境类似,只是安装部分改为使用Docker命令。 最后,我们生成相关问题: §§相关问题§§ 1. 在配置MySQL主从复制时,如何解决同步错误? 2. Nginx负载均衡有哪些调度算法?如何配置? 3. 如何监控MySQL主从复制状态Nginx负载均衡状态? 4. 在容器环境中部署MySQL主从复制需要注意哪些问题? </think>### 从零开始配置Nginx负载均衡与MySQL主从复制 #### 一、环境准备 1. **服务器规划**(参考引用[1]): ```markdown | 角色 | IP地址 | 软件 | |----------------|-------------|--------------| | Nginx负载均衡器 | 172.18.0.11 | Nginx | | Web服务器1 | 172.18.0.111| Apache+PHP | | Web服务器2 | 172.18.0.112| Apache+PHP | | MySQL主库 | 172.18.0.201| MySQL 5.7/8.0| | MySQL从库 | 172.18.0.202| MySQL 5.7/8.0| ``` 2. **基础要求**: - 所有节点网络互通(172.18.0.0/16) - CentOS 7操作系统 - 关闭防火墙:`systemctl stop firewalld && systemctl disable firewalld` - 禁用SELinux:修改`/etc/selinux/config`为`SELINUX=disabled` --- #### 二、MySQL主从复制配置 ##### 主库操作(172.18.0.201) 1. **安装MySQL**(参考引用[3]): ```bash wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm rpm -ivh mysql80-community-release-el7-6.noarch.rpm yum -y install mysql-community-server systemctl start mysqld && systemctl enable mysqld ``` 2. **修改配置文件**: ```ini # /etc/my.cnf [mysqld] server-id=201 # 唯一ID log-bin=mysql-bin # 开启二进制日志 binlog-format=ROW # 日志格式 ``` 3. **重启并授权复制用户**: ```bash systemctl restart mysqld mysql -uroot -p ``` ```sql CREATE USER 'repl'@'172.18.0.%' IDENTIFIED BY 'Repl@123'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.18.0.%'; FLUSH PRIVILEGES; SHOW MASTER STATUS; -- 记录FilePosition值 ``` > 输出示例:`File: mysql-bin.000001, Position: 745` ##### 从库操作(172.18.0.202) 1. **安装MySQL**(同主库) 2. **修改配置文件**: ```ini # /etc/my.cnf [mysqld] server-id=202 # 区别于主库 relay-log=slave-relay-bin # 中继日志 ``` 3. **配置主从同步**: ```sql CHANGE MASTER TO MASTER_HOST='172.18.0.201', MASTER_USER='repl', MASTER_PASSWORD='Repl@123', MASTER_LOG_FILE='mysql-bin.000001', -- 替换主库记录的File MASTER_LOG_POS=745; -- 替换主库记录的Position START SLAVE; SHOW SLAVE STATUS\G -- 验证Slave_IO_RunningSlave_SQL_Running均为Yes ``` --- #### 三、Nginx负载均衡配置 ##### Nginx节点操作(172.18.0.11) 1. **安装Nginx**: ```bash yum install -y epel-release yum install -y nginx systemctl start nginx && systemctl enable nginx ``` 2. **配置负载均衡**: ```nginx # /etc/nginx/nginx.conf http { upstream backend { server 172.18.0.111:80 weight=1; # Web服务器1 server 172.18.0.112:80 weight=1; # Web服务器2 } server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } ``` 3. **重启Nginx**: ```bash nginx -t && systemctl restart nginx ``` ##### Web节点验证(172.18.0.111/112) 1. 创建测试文件: ```bash echo "Server 111" > /var/www/html/index.html # 在111服务器 echo "Server 112" > /var/www/html/index.html # 在112服务器 ``` 2. 访问负载均衡器: ```bash curl http://172.18.0.11 # 多次请求将轮询显示不同内容 ``` --- #### 四、验证全流程 1. **MySQL主从验证**: - 主库创建数据: ```sql CREATE DATABASE testdb; USE testdb; CREATE TABLE users(id INT PRIMARY KEY, name VARCHAR(20)); INSERT INTO users VALUES(1, 'Alice'); ``` - 从库检查数据: ```sql SELECT * FROM testdb.users; # 应同步显示数据 ``` 2. **Web应用连接数据库**: - 修改PHP代码连接主库IP(172.18.0.201) - 所有写操作自动指向主库,读操作可分流到从库(需应用层实现) > 定时任务可配置数据库备份(参考引用[2]): > `0 2 * * * /usr/bin/mysqldump -uroot -p密码 --all-databases > /backup/db_full_$(date +%F).sql` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值