• php logo
    PHP,  技术,  编程语言

    php 去除文件Bom头

    遇到文件处理,特别是excel文件处理时,经常会遇到bom头的问题,下面我们介绍下如何去除文件的Bom头。 代码 原理 实际应用的是sed命令: 这种方式,不需要将文件内容加载到内存里面,减少了内存的消耗以及大文件可能造成的内存超限问题。

  • go logo
    Go,  技术,  编程语言

    从零开始搭建go项目(gin框架)(五) – 支持Mysql

    本节内容,我们将mysql引入我们的框架 (本地mysql部署可参考 Mysql集群部署(主从复制)。 第一步 引入mysql相关服务 第二步 创建测试库表 第三部 对mysql进行封装 创建./library/database/mysql.go : 第四步 增加mysql配置与读取 ./conf/config.yaml, 新增 ./conf/config.go: 第五步 mysql初始化 创建文件./helpers/mysql.go: 第六步 main函数中调用 ./main.go : 至此,我们项目就已经支持mysql使用啦~,下一章我们再介绍mysql在项目中的具体使用 参考链接 https://gorm.io/

  • mysql
    Mysql,  技术,  服务组件

    Mysql集群部署(MHA)

    MySQL高可用方案中,MHA(Master High Availability)是一个相对成熟的解决方案,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。 该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。 mysql主从部署 参见 Mysql集群部署(主从复制) 配置公钥互信 创建mha管理节点 目前容器和ip对应关系为: mysql-master 172.17.0.2 mysql-slave-1 172.17.0.3 mysql-slave-1 172.17.0.4 mysql-mha-manager 172.17.0.5 设置所有容器的root密码, 配置互信时需要: MHA部署 增加文件脚本/usr/local/bin/master_ip_failover: 进入容器 mysql-mha-manager 创建mha配置文件 /etc/mha-manager.cnf: 配置文件校验 其他命令 masterha_check_ssh…

  • mysql
    Mysql,  技术,  服务组件

    Mysql集群部署(主从复制)

    基础环境准备 # 获取centos镜像,注:以下镜像为整合了 ansible 的centos镜像,可以解决大量的依赖问题 docker pull ansible/centos7-ansible 容器中安装基础工具 启动容器: 进入容器: 安装Mysql 记住生成的临时用户名和密码,保存下来,之后会用到 编辑配置文件 查看my.cnf 文件位置 ./mysql –help | grep my.cnf 这个实际上就是mysql尝试去读取配置文件的路径顺序,没有找到话,mysql会走默认配置 所以,看下这几处位置是否有配置文件,有的话,编辑该文件,没有的话,直接在第一读取位置,创建配置文件,如: 创建 /etc/my.cnf 配置文件。 /etc/my.cnf: 添加mysqld服务到系统 启动mysql 将mysql命令添加到服务 登录mysql 使用之前随机生成的密码 修改root密码 使支持远程连接…

  • redis
    Redis,  技术

    Redis Cluster集群节点间通信

    Redis 的集群节点之间的通信采取 gossip 协议进行通信,在 redis cluster 架构下,每个 redis 要放开两个端口号,比如一个是 6379,另外一个就是 加10000 的端口号,比如 16379,16379 端口号是用来进行节点间通信的。 Gossip协议 Gossip protocol 也叫 Epidemic Protocol (流行病协议),顾名思义,就像流言蜚语一样,利用一种随机、带有传染性的方式,将信息传播到整个网络中,并在一定时间内,使得系统内的所有节点数据一致。这里简单介绍下Gossip协议的执行过程: 当一个种子节点有状态需要更新到网络中的其他节点时,它会随机的选择周围几个节点散播消息,收到消息的节点也会重复该过程,直至最终网络中所有的节点都收到了消息。 Gossip协议优势: 扩展性 网络可以允许节点的任意增加和减少,新增加的节点的状态最终会与其他节点一致。 容错 网络中任何节点的宕机和重启都不会影响 Gossip 消息的传播,Gossip 协议具有天然的分布式系统容错特性。 去中心化 Gossip 协议不要求任何中心节点,所有节点都可以是对等的,任何一个节点无需知道整个网络状况,只要网络是连通的,任意一个节点就可以把消息散播到全网。…

  • redis
    Redis,  技术,  服务组件

    Redis Cluster “cluster nodes”命令

    redis cluster集群部署后,可以通过redis-cli的 cluster nodes 命令查看集群的节点信息。 输出的每行,都代表一个节点,下面我们讲解下这些信息的含义,为了更直观些,我们将这些信息放入表格里: id ip:port flags master ping-sent pong-recv config-epoch config-epoch slot 46dc4de072aad1e44548cfde5b56239001eaff5a 127.0.0.1:6380@16380 master – 0 1623402917302 2 connected 5461-10922 18cc5a352ba7a567bdbad5d777b3712a7b81b0f8 127.0.0.1:6384@16384 slave 99b3c660b15114ef55247e5b07cbf8f34621bee3 0 1623402916327 3 connected 99b3c660b15114ef55247e5b07cbf8f34621bee3…

  • redis
    Redis,  技术,  服务组件

    Redis Cluster集群为何是16384个哈希槽

    我们都知道,对于客户端请求的key,redis是根据公式 HASH_SLOT=CRC16(key) mod 16384,计算出映射到哪个分片上,然后Redis会去相应的节点进行操作。 CRC16算法产生的hash值有16bit,该算法可以产生65536(2^16)个值。换句话说,值是分布在0~65535之间。那作者在做mod运算的时候,为什么不mod 65536,而选择mod 16384?这个问题,作者是给出了回答的,详见: https://github.com/antirez/redis/issues/2576,下面我们来具体的讲一下。 1. 如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。 redis集群的节点之间会定期发送ping/pong消息,交换数据信息的,交换的数据信息,由消息体和消息头组成。 消息体无外乎是一些节点标识,IP,端口号,发送时间等等,这里我们主要关注的是消息头: 可以看到有个字段名为 myslots 的char数组,长度为 CLUSTER_SLOTS/8,CLUSTER_SLOTS为常量16384,所以该数组长度为16384/8,这其实是一个bitmap,每一个位代表一个槽,如果该位为1,表示这个槽是属于这个节点的。 该数组所占空间大小为 16384÷8÷1024=2kb,当槽位为65536时,这块的大小是: 65536÷8÷1024=8kb。消息体中会携带一定数量的其他节点的信息,节点信息里同样包含其槽位信息,节点数大约占集群节点总数量的十分之一,至少是3个节点的信息。节点数量越多,消息体内容越大。 因为每秒钟,redis节点需要发送一定数量的ping消息作为心跳包,如果槽位为65536,这个ping消息的消息头太大了,浪费带宽。 2. redis的集群主节点数量基本不可能超过1000个 如上所述,集群节点越多,心跳包的消息体内携带的数据越多。如果节点过1000个,也会导致网络拥堵。因此redis作者,不建议redis cluster节点数量超过1000个。 3. 槽位越小,节点少的情况下,压缩率高 Redis主节点的配置信息中,它所负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中,会对bitmap进行压缩,但是如果bitmap的填充率slots / N很高的话(N表示节点数),bitmap的压缩率就很低。 如果节点数很少,而哈希槽数量很多的话,bitmap的压缩率就很低。 综上所述,作者决定取16384个槽,不多不少,刚刚好! 相关链接 https://www.cnblogs.com/rjzheng/p/11430592.html https://zhuanlan.zhihu.com/p/99037321

  • redis
    Redis,  技术,  服务组件

    Redis Cluster集群部署

    Redis Cluster是Redis官方提供的Redis集群功能。 下载镜像 docker pull redis:6.2.4 运行镜像 我们需要创建6个redis容器(redis集群,最少必须有6个节点,3主3从) redis-node1:6379 redis-node2:6380 redis-node3:6381 redis-node4:6382 redis-node5:6383 redis-node6:6384 创建挂载目录 分别在每个conf目录下创建文件redis.conf node1/conf/redis.conf : 同样,node1 ~ 6端口号依次为: 6379,6380,6381,6382,6383,6384 创建虚拟网卡 创建虚拟网卡,主要是用于redis-cluster能于外界进行网络通信,一般常用桥接模式。 docker network create redis-net 编辑docker-compose.yml文件 启动容器 docker-compose up -d…

  • 算法
    技术,  算法

    两数相加 – LeetCode2

    题目 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 示例 2: 输入:l1 = [0], l2 = [0] 输出:[0] 示例 3:…