ShardingSphere-Proxy 负载均衡故障转移

本文介绍了如何在单机和微服务环境下,通过Haproxy实现对ShardingSphere-proxy的高可用集群部署,包括添加用户、配置代理、监控管理及故障转移策略,确保服务的稳定性和连续性。

单机状态下,要是 ShardingSphere-proxy 服务出现故障不可用,整个服务读写均会出现故障,导致整体服务不可以,微服务状态下更会导致整个集群故障,引发更严重的后果,本次生产环境需要实现如下需求:

  1. 负载均衡

  2. 故障转移

  3. 不停机维护

架构图如下

ababa094887c065ae39ce6a7133fb844.png

组件
主机备注
Haproxy 192.168.32.200下载地址见文末原文链接 
ShardingSphere-proxy 192.168.1.166:3307
ShardingSphere-proxy 192.168.1.166:3308
ShardingSphere 所在宿主机192.168.1.166 

跟着我一起实现 Haproxy 对 ShardingSphere-proxy 进行集群部署。

01

添加用户

#添加haproxy组
groupadd -r haproxy
#创建nginx运行账户haproxy并加入到haproxy组,不允许haproxy用户直接登录系统
useradd -r -g haproxy -M -s /sbin/nologin haproxy

02

下载安装

mkdir -p /home/haproxy
cd /home/haproxy
tar -zxvf haproxy-2.3.5.tar.gz
make TARGET=linux-glibc PREFIX=/usr/local/haproxy
make install TARGET=linux-glibc PREFIX=/usr/local/haproxy
mkdir -p /usr/local/haproxy/{conf,log,errorfiles}

03

配置代理 ShardingSphere-proxy

touch /usr/local/haproxy/conf/haproxy.cfg
vim /usr/local/haproxy/conf/haproxy.cfg

配置文件

global
   daemon   # 后台方式运行
   nbproc 1
   chroot /usr/local/haproxy
   pidfile haproxy.pid
   user haproxy
   group haproxy
defaults
   mode tcp               #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
   retries 2               #两次连接失败就认为是服务器不可用,也可以通过后面设置
   option redispatch       #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
   option abortonclose     #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
   maxconn 65530            #默认的最大连接数
   timeout connect 5000ms  #连接超时
   timeout client 30000ms  #客户端超时
   timeout server 30000ms  #服务器超时
   #timeout check 2000      #=心跳检测超时
   log 127.0.0.1 local3  info #[err warning info debug],日志文件的输出定向。产生的日志级别为local3. 系统中local1-7,用户自己定义
   balance roundrobin      # 采用轮询算法

当出现此类分片键处于运算表达式或函数中的 SQL 时,ShardingSphere 将采用全路由的形式获取结果。

  • 配置

listen delegate                         #这里是配置负载均衡,test1是名字,可以任意
   bind 0.0.0.0:3307            #这里是监听的IP地址和端口,端口号可以在0-65535之间,要避免端口冲突
   mode tcp                     #连接的协议,这里是tcp协议
   #maxconn 4086
   #log 127.0.0.1 local0 debug
   #option httplog                ###日志类别,记载http日志
   #option dontlognull            ###不记录空连接产生的日志信息
   option httpclose              ###每次请求完毕后主动关闭http通道,haproxy不支持keep-alive
   retries 3      ###3次连接失败就认为服务器不可用,主要通过后面的check检查
   server s1 192.168.1.166:3307 check #负载的MySQL实例1
   server s2 192.168.1.166:3308 check #负载的MySQL实例2 可以有多个,往下排列即
  • 系统状态配置

listen haproxy_stats
   stats   enable
   bind    *:8082
   mode    http
   option  httplog
   log     global
   maxconn 10
   stats   refresh 30s
   stats   uri /admin
   stats   realm haproxy
   stats   auth admin:admin
   stats   hide-version
   stats   admin if TRUE

04

修改启动脚本,配置开机启动

# 将源码目录下的examples/haproxy.init复制到/etc/init.d/下
cp /home/haproxy/haproxy-2.3.5/examples/haproxy.init /etc/init.d/haproxy
# 添加执行权限
chmod +x /etc/init.d/haproxy
修改启动脚本,加入如下配置


vim /etc/init.d/haproxy
# 修改调整Begin
BASENAME=`haproxy`
BIN=/usr/local/haproxy/sbin/haproxy
CFG=/usr/local/haproxy/conf/haproxy.cfg
[ -f $CFG ] || exit 1


PIDFILE=/var/run/haproxy.pid
LOCKFILE=/var/lock/subsys/$BASENAME
# 修改调整END


# 添加service服务
chkconfig -–add /etc/init.d/haproxy

05

启动

systemctl start haproxy

06

管理界面信息查看

http://192.168.32.200:8082/admin_stats

用户名密码:admin/admin

e0059e7afc2cc0462053bb6c96262dc4.png

outside_default.png

outside_default.png

S1 S2两服务启动,可以通过界面进行管理,包括服务下线,保护模式设置,维护可以通过界面设置单独处理,保证有当前有一个可用服务 更多内容可查看原文(https://blog.nxhz1688.com/2021/03/22/sharding-proxy-load/),包含具体配置。

本文由郑思扬授权转载

关于 Apache ShardingSphere

Apache ShardingSphere 是一款分布式 SQL 事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。

95f9aa1b68c94c80dabd26bbda93d9fd.jpeg

<think>嗯,用户想在.NET环境下使用ShardingSphere Proxy处理并发问题,需要了解最佳实践。首先,我得回顾一下ShardingSphere Proxy的基本架构和工作原理。ShardingSphere Proxy是一个数据库中间件,作为透明代理处理分片、读写分离等,而.NET应用通过连接它来访问数据库。 接下来,并发处理的关键点可能包括连接池配置、事务管理、分片策略优化,以及如何利用ShardingSphere的特性来分散负载。需要考虑.NET中常用的数据库访问库,比如Entity Framework Core或Dapper,如何与ShardingSphere Proxy集成。 然后,连接池设置很重要,合理配置最大连接数,避免资源耗尽。比如,在.NET中使用SqlConnection时,配置连接字符串中的Pooling参数,可能需要调整Max Pool Size。同时,ShardingSphere Proxy自身也有连接池配置,需要两边协调,防止连接泄漏。 事务管理方面,分布式事务是个挑战。ShardingSphere支持柔性事务,比如SAGA或XA,但在.NET中可能需要结合第三方框架,比如CAP库,或者使用补偿机制。需要说明如何在代码中处理事务,比如显式控制事务范围,避免长事务导致锁竞争。 分片策略优化也很关键。合理的分片键选择能减少跨分片查询,提升并发性能。比如,按用户ID哈希分片,确保同一用户的数据在同一分片,减少分布式事务。还要避免热点分片,可能需要结合范围分片或复合分片键。 负载均衡方面,ShardingSphere Proxy可以配合注册中心实现实例的动态发现,比如使用Zookeeper或Nacos。在.NET中,可以通过配置连接字符串到多个Proxy实例,或者使用客户端侧负载均衡策略,比如轮询或随机选择。 另外,监控和日志也不能忽视。ShardingSphere提供Metrics数据,可以集成到Prometheus和Grafana,实时监控连接数、查询延迟等指标。在.NET应用中,记录慢查询和错误日志,帮助及时发现问题。 还有,重试机制和熔断机制,比如使用Polly库处理暂时性故障,避免雪崩效应。并发场景下,幂等性设计也很重要,确保重试不会导致数据不一致。 最后,可能需要考虑与.NET生态的兼容性,比如使用MySQL或PostgreSQL驱动连接Proxy,确保协议兼容。测试方面,建议进行压力测试,模拟高并发场景,验证配置的有效性。 总结下来,步骤应该是:配置连接池,优化分片策略,管理分布式事务,实现负载均衡,集成监控,设计重试和熔断,以及充分测试。需要把这些点有条理地组织起来,给出具体代码示例,比如连接字符串配置、事务使用示例,以及负载均衡的设置方法。</think>在.NET环境下使用ShardingSphere Proxy处理并发问题,需要结合其分布式特性与.NET的并发控制机制。以下是分步骤的最佳实践: --- ### 一、连接池优化 1. **ShardingSphere Proxy配置** 在`server.yaml`中设置合理的连接池参数: ```yaml props: max-connections-size-per-query: 50 executor-size: 20 ``` 这控制每个查询的最大连接数[^1]。 2. **.NET客户端配置** 使用`MySqlConnector`或`Npgsql`时,配置连接池参数: ```csharp var connectionString = "Server=proxy_host;Port=3307;Database=sharding_db;Uid=user;Pwd=pass;MaximumPoolSize=100;"; ``` --- ### 二、分片策略与并发控制 1. **避免跨分片事务** 通过设计分片键(如用户ID哈希),确保事务操作集中在单一分片: ```sql CREATE SHARDING TABLE RULE t_order ( DATANODES("ds_${0..1}.t_order_${0..1}"), SHARDING_COLUMN=user_id, TYPE(NAME="hash_mod", PROPERTIES("sharding-count"="4")) ); ``` 2. **读写分离负载均衡** 在`server.yaml`中配置多数据源+负载均衡: ```yaml rules: - !READWRITE_SPLITTING dataSources: pr_ds: writeDataSourceName: write_ds readDataSourceNames: - read_ds_0 - read_ds_1 loadBalancerName: round_robin ``` --- ### 三、.NET并发处理模式 1. **异步非阻塞IO** 使用`async/await`避免线程阻塞: ```csharp public async Task<List<Order>> GetOrdersAsync(int userId) { using var conn = new MySqlConnection(connectionString); return await conn.QueryAsync<Order>("SELECT * FROM t_order WHERE user_id=@uid", new { uid = userId }); } ``` 2. **分布式锁控制** 通过Redis实现跨实例锁: ```csharp var redis = ConnectionMultiplexer.Connect("redis_server"); var @lock = redis.GetDatabase().LockTake("order_creation_lock", "token", TimeSpan.FromSeconds(10)); ``` --- ### 四、监控与熔断 1. **集成Prometheus监控** 通过ShardingSphere-Proxy的`/metrics`端点暴露指标,在.NET中使用`prometheus-net`采集应用层指标: ```csharp var counter = Metrics.CreateCounter("sql_requests_total", "Total SQL requests"); counter.Inc(); ``` 2. **Polly熔断策略** 对数据库访问添加熔断机制: ```csharp var policy = Policy.Handle<MySqlException>() .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); ``` --- ### 五、压力测试验证 使用`BenchmarkDotNet`模拟高并发场景: ```csharp [SimpleJob(RuntimeMoniker.Net70)] public class ShardingBenchmark { [Benchmark] public void ParallelQuery() { Parallel.For(0, 1000, async i => { await GetOrdersAsync(i % 100); }); } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值