C++ Learn

因为工作原因开始从头学习C++和cmake等的使用。 Linux下编译cpp 下面是一个非常简单的例子,下载了github开源的json库,创建了一个数组,并且在标准输出打印出来。 // main.cpp #include <iostream>#include <json.hpp> using json = nlohmann::json; using namespace std; int main (){ json mJson; for (int i=0; i<10; i++){ mJson["number"].push_back(i); } cout << mJson.dump() << endl; } // 输出: {"number":[0,1,2,3,4,5,6,7,8,9]} 在Linux平台编译 g++ main.cpp -o myProg -I /json.hpp所在目录/ ./myProg 多文件编译 // main.cpp #include <iostream>#include <Dog.h> using namespace std; int main (){ woof("meow"); } // Dog.h #ifndef DOG_H #define DOG_H #include <string> void woof(std::string woof); #endif // Dog....

January 26, 2022

基于Docker的MySQL主从配置

这个很简单,直接上操作. 创建数据库 #主库 docker run --name mysql-master \ -p 6012:3306 \ -v /opt/data/mysql-master/data/:/var/lib/mysql \ #数据持久化 -v /etc/localtime:/etc/localtime \ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 #从库 docker run --name mysql-slave \ -p 6014:3306 \ -v /opt/data/mysql-slave/data/:/var/lib/mysql \ #数据持久化 -v /etc/localtime:/etc/localtime \ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 配置MySQL的配置文件 这个文件配置内容有时间再好好搜一下啥意思,回头更新。 [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql #log-error = /var/log/mysql/error.log # By default we only accept connections from localhost #bind-address = 127....

February 20, 2019

Open vSwitch的简单应用

docker 真是无所不能,使一切管理都变得简单清晰起来。但是使用 docker也带来一些小了问题。 生产环境中,使用多台服务器协同生产是很正常的。如果都使用 docker 部署如 MySQL ,需要做主从同步,但是为了容灾,宿主机又不是同一服务器。就会出现通讯的问题。 使用 Open vSwitch Open vSwitch 是一个虚拟交换机。我们通过她可实现 docker 跨主机通信。 安装 #CentOS yum install openvswitch #Ubuntu & Debian apt install openvswitch-switch #Arch pacman -S openvswitch 修改docker0的网段 修改完docker的网段后,新生成的容器会变为配置所在网段。 vim /lib/systemd/system/docker.service #主机1 ExecStart=/usr/bin/dockerd --bip=172.17.1.1/24 #主机2 ExecStart=/usr/bin/dockerd --bip=172.17.2.1/24 systemctl daemon-reload systemctl restart docker 创建网桥、建立gre隧道 #创建网桥 br0 ovs-vsctl add-br br0 #激活网桥 ip link set dev br0 up #设置gre隧道 ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192....

February 18, 2019

Ubuntu常见操作

因为上手时间不长,用得少,很多配置容易忘记。所以做了快查手册,以便自己及时获取,快速解决问题。 添加远程分支并取别名 git remote add github [email protected]:JoyBanana/Pan_163.git #这里添加别名为github. 删除远程分支,将add替换为为remove即可 查看远程分支 $ git remote -v banwagong ssh://[email protected]:29280/home/git/pan_163.git (fetch) banwagong ssh://[email protected]:29280/home/git/pan_163.git (push) github [email protected]:JoyBanana/Pan_163.git (fetch) github [email protected]:JoyBanana/Pan_163.git (push) 拉取远程分支代码 git pull banwagong master 推送本地代码到远程分支 git push banwagong master 删除远程分支文件但是不影响本地 git rm --cached filename/-r directory git commit -m "xxxx" git push 删除远程分支的文件夹时要加 -r参数,表示递归

February 14, 2019

git快查手册

因为上手时间不长,用得少,很多配置容易忘记。所以做了快查手册,以便自己及时获取,快速解决问题。 添加远程分支并取别名 git remote add github [email protected]:JoyBanana/Pan_163.git #这里添加别名为github. 删除远程分支,将add替换为为remove即可 查看远程分支 $ git remote -v banwagong ssh://[email protected]:29280/home/git/pan_163.git (fetch) banwagong ssh://[email protected]:29280/home/git/pan_163.git (push) github [email protected]:JoyBanana/Pan_163.git (fetch) github [email protected]:JoyBanana/Pan_163.git (push) 拉取远程分支代码 git pull banwagong master 推送本地代码到远程分支 git push banwagong master 删除远程分支文件但是不影响本地 git rm --cached filename/-r directory git commit -m "xxxx" git push 删除远程分支的文件夹时要加 -r参数,表示递归

February 14, 2019

Nginx快查手册

因为上手时间不长,用得少,很多配置容易忘记。所以做了快查手册,以便自己及时获取,快速解决问题。 Nginx 常见配置 proxy_pass的使用 - 多服务同端口 可以解决如 同一服务器下部署多个项目 Ajax 请求跨域的问题 常用location /proxy/ { proxy_pass http://127.0.0.1/; #代理到URL:http://127.0.0.1/test.html } location /proxy/ { proxy_pass http://127.0.0.1; #代理到URL:http://127.0.0.1/proxy/test.html } location /proxy/ { proxy_pass http://127.0.0.1/aaa/; #代理到URL:http://127.0.0.1/aaa/test.html } location /proxy/ { proxy_pass http://127.0.0.1/aaa; #代理到URL:http://127.0.0.1/aaatest.html } 同端口不同二级域名 添加多个 server => listen 相同 端口, server_name 字段指定二级域名 即可。

February 14, 2019

初探消息队列-Message Queue

消息队列的产品还是蛮多的,比如 ActiveMQ RabbitMQ 还有阿里的 RocketMQ…… 那这玩意是干哈的?有什么作用呢?趁这个机会我相要深入理解下消息队列 => Message queue 消息队列是干哈的? 主要是为了限流削峰 场景:高并发用户注册。 没有MQ,当高并发请求读写数据库时,系统会创建很多数据库连接。导致连接异常,触发 too many connections,导致业务故障。 使用MQ,并发请求会先写入队列中,系统从MQ中读取消息,依照逻辑逐个处理。 MQ的工作流程 MQ由3个对象组成:生产者、队列、消费者。 我们以 RabbitMQ 为例,常用的有两种工作模式。 简单模式 生产者负责生产消息,将消息发送到队列中,消费者监听队列,队列有消息就进行消费。 工作模式 工作模式与简单模式相同,区别在于可以添加多个消费者。默认的是轮询模式分发消息。有个问题出现了,有的消费者处理的快有的处理的慢,处理的快我们就希望他多处理一点。这个时候怎么办呢? RabbitMQ 有消息确认机制。默认我们给他的是自动确认,但是我们可以自己设置为手动确认。这样就解决了这个问题。 RabbitMQ安装 使用 docker 安装 RabbitMQ,如果需要web界面,应 pull tag 为 rabbitmq:3-management 的安装镜像。 ……未完待续

January 23, 2019

第一次使用Zabbix

公司做是教育的,有很多服务器跑在校园内。因为程序不够健壮,导致会有很多小问题,随着公司业务扩大,服务器越来越多。为了能够及时发现、处理这些问题我们需要一款监控软件来帮助我们监控这些应用。我们最终选定了 Zabbix 作为我们的监控报警软件。 部署Zabbix服务端 官网看到当前Zabbix版本是4.0,服务端我们选择在docker中部署Zabbix appliance。该镜像内置了MySQL、Zabbix Server、Nginx,安装命令也较为简单。 docker run --name zabbix-appliance -t \ -p 10051:10051 \ -p 80:80 \ -d zabbix/zabbix-appliance:latest 自此,服务端安装完成。真是简单到猴子都能看懂了这个时候你就可以去登录Zabbix服务端了,默认用户名为Admin密码zabbix。 部署Zabbix-agent 由于我们要监控网卡流量、系统内的进程等,所以zabbix-agent我们直接安装在被监控的机器上,而不是采用docker安装。 在Ubuntu上安装: apt install zabbix-agent 修改zabbix-agent配置文件vim /etc/zabbix/zabbix_agentd.conf,设置监控端的IP地址和本机主机名。注: 本地主机名必须配置的与服务端一致。Zabbix钉钉报警 关于钉钉报警,直接向钉钉机器人发送URL请求就可以,这种脚本真是的全网都是,一搜一大把,我就不多废话了,随便找个脚本写进去配置好就行了。 我要说的是,我们在docker容器内部署的zabbix,发送URL请求可能会缺少Python库,或者没有安装curl等等等等。你可以直接进入容器安装。这个镜像是基于AlpineLinux,信奉Small. Simple. Secure.她有自己的包管理器,你可以直接安装Python3或者其他工具: apk install python3

November 29, 2018

内网穿透与端口转发

因为公司需要远程操作和其他一些奇奇怪怪的原因,需要实现穿透内网,外网访问局域网中的服务. 实现类似于花生壳的功能. 大学时期觉得花生壳老牛逼了,明明是内网的服务居然可以外网访问.准备:现在有内网机器 A ,可以访问外网,可以访问 B ,一台具有公网IP的Linux服务器 B IP地址为 2.2.2.2. ssh端口映射 假设办公室的内网机器 A 操作系统为Linux,开启了WEB访问端口为 80 。我们希望在家中也能访问办公室 A 上的WEB页面。 那么你可以这么做: 首先让服务器 A 与远程主机 B 建立一个反向代理,将 A 的80端口映射到 B 的2222端口上. ssh -ngfNTR 2222:localhost:80 [email protected] 输入主机 B 的密码,这样远程主机 B 访问自己的2222端口,相当于访问 A 的80端口。 接下来在远程主机 B 上执行: ssh -fCNL *:2223:localhost:2222 localhost 将本机的2222端口正向代理到自己的2223端口上。 至此,端口转发完成。我们在家里的浏览器上键入 http://2.2.2.2:2223/ 与在公司直接访问主机 A 的 80 端口是一样的。 如何工作的: B 2223 –> B 2222 –> A 80 然而不幸的是SSH连接是会超时关闭的,如果连接关闭,隧道无法维持,为此我们需要一种方案来提供一条稳定的SSH 反向隧道。一个最简单的方法就是autossh,这个软件会在超时之后自动重新建立SSH隧道,这样就解决了隧道的稳定性问题。 goproxy 如果只是映射单个端口,使用SSH是比较简便快捷的。如果转发多个服务器的多个端口,使用SSH不免有些繁琐,而且不容易辨认那些端口映射了什么。 goproxy托管在GitHub上,他是一个功能强大的端口转发、内网穿透工具。通过他的--k参数,可以比较容易辨认、控制这些进程。 这个软件功能挺强大的,改天要好好研究一下。但是配置有些繁琐,个人感觉很臃肿。 frp 这个是我找到的比较好用的软件之一了。配置简单,跨平台。这个项目托管在GitHub上,你可以点击这里跳转。 这个软件的配置简直简单到令人发指。这里不多赘述,具体可以参见官方example....

November 8, 2018

Docker的基本安装和使用

Docker的基本安装和使用 Docker 现在应用真的是越来越广泛了,越来越多的企业用它来部署项目,很方便。 Docker 在yum和apt两大主流包管理器上,都已经有了Docker,可以直接安装。 以Ubuntu为例 切换到root用户下操作,直接安装。 apt install docker.io 使用Docker安装MySQL 写MySQL的原因还是涉及到数据持久化的问题,如果不把数据映射到主机硬盘上的话,下次开启就没有数据了。 配置MySQL可以查找官方镜像并拉取 docker search mysql #在官方的Docker Hub上查找合适的mysql版本,后边还有点赞数 docker pull mysql #我一般选star多的,直接pull下来 启动mysql docker run -p 3306:3306 --name mymysql -v /opt/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql 我们使用-v参数将mysql的数据指向宿主机的/opt/data文件夹下,这样以后启动的话数据也不会丢失。 Docker的一些简单常用命令 参数 含义 -v 挂载宿主机目录到容器内,实现数据持久化 -d 后台执行你的实例 docker exec -it ‘yourInstance’ bash 进入你的实例容器 -p 映射容器端口到宿主机端口 你可以使用docker做很多事情,甚至可以在x86架构的平台上运行arm程序

July 16, 2018