【全网首发】Mogdb 5.0.6新特性:CM双网卡生产落地方案

alt

在写这篇文章的时候,刚刚加班结束,顺手写了这篇文章。

前言

某大型全国性行业核心系统数据库需要A、B两个物理隔离的双网卡架构方案,已成为行业标准。而最新发布的MogDB 5.0.6的CM新增支持流复制双网段部署,用于网卡级高可用容灾(PTK 1.4及更高版本)。支持双网段后,某个节点在发生单网段故障后仍然能保证正常工作,提供网段级故障的高可用管理能力,保驾了数据库底座的稳定运行。

CM简介

CM(Cluster Manager)是一款集群资源管理软件。支持自定义资源 监控,提供了数据库主备的状态监控、网络通信故障监控、文件系统 故障监控、故障自动主备切换等能力。 MogDB数据库和CM是解耦的,可以分开安装。CM为数据库 集群提供管理服务,功能十分强大。

CM功能特性

  • 数据库实例主备角色仲裁
  • CM自身高可用仲裁
  • 数据库实例运行状态监控
  • 数据库实例所在节点资源检测
  • 数据库集群、节点、实例的启动、停止
  • 数据库集群状态查询、状态更新
  • 数据库集群数据库实例switchover、failover
  • 支持双网虚拟ip(VIP)
  • CM支持两节点部署
  • CM事件触发器
  • CM支持双网段

生产落地方案

alt 如图为完整架构方案,MogDB支持主备双机房的方案,A和B网络物理隔离,分别联通独立的A和B交换机,两者不互通,并且在A和B上挂载两个vip,对应用服务器供服务。

流复制网络方案

C和D网卡做Bond0,再通过A和B两个交换机中单独虚拟出一个vlan,通过VLAN Trunking技术做堆叠,提供流复制网络的交换机高可用,为流复制网络提供通讯。

本次落地的方案

此次方案为一主一备的架构。同样A和B网络提供业务网络。 C和D网卡做Bond0+VLAN Trunking技术做堆叠,为流复制提供冗余。 alt

安装部署

主机业务A网业务B网流复制网
mogdb110.130.0.510.130.4.5192.168.100
mogdb210.130.0.710.130.4.7192.168.101

配置config

PTK对CM实现了适配,安装时在config.yaml文件中配置参数ha_ips即可实现双网段部署。需要下载PTK 1.4及更高版本。

vi config.2024-04-01T17_37_01.yaml

global:
  cluster_name: ats_cs
  user: omm506
  group: omm506
  db_password: pTk6YmQwZmY1ODU8QDw9PUM/Q085ZDFjV2g5dGZFQVRpSlJfQ2tGeG1GTzB3WjRfa3lDSmpsdjVTcVdVLUE=
  db_port: 28000
  base_dir: /opt/mogdb506
  db_conf:
    log_min_messages: 'DEBUG5'
  ssh_option:
    port: 22
    user: root
    key_file: "/root/.ssh/id_rsa"
  cm_option:
    cm_server_port: 15300
    cm_server_conf:
      ddb_type: 1
      enable_ssl: on
      third_party_gateway_ip: 10.130.7.254,10.130.3.254
      cms_enable_failover_on2nodes: 'true'
      cms_enable_db_crash_recovery: 'true'
      log_min_messages: 'DEBUG5'
    cm_agent_conf:
      enable_ssl: on
      log_min_messages: 'DEBUG5'
db_servers:
  - host: 10.130.4.5
    role: primary
    az_name: AZ1
    az_priority: 1
    ha_ips: [10.130.0.5]
    ssh_option:
      password: pTk6MzkzYTk5ZTg8QDw9PUM/REpvRHhwYk1LWGRjS3dER0I5RC1NNFVnMFNjalU1NUpQSGVCWXFHTU5LLVU=
  - host: 10.130.4.7
    role: standby
    az_name: AZ1
    az_priority: 1
    ha_ips: [10.130.0.7]
    ssh_option:
      password: pTk6MzkzYTk5ZTg8QDw9PUM/REpvRHhwYk1LWGRjS3dER0I5RC1NNFVnMFNjalU1NUpQSGVCWXFHTU5LLVU=

查看网卡的网关

两节点部署(一主一备),需要在yaml配置文件中配置third_party_gateway_ip参数作为仲裁ip(单网段的三方网关)为双网段参数,以逗号分隔。这里配置如下: third_party_gateway_ip :10.130.7.254,10.130.3.254

[root@mogdb1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.130.7.254     0.0.0.0         UG    102    0        0 em1
0.0.0.0         10.130.3.254     0.0.0.0         UG    103    0        0 em2
10.130.0.0       0.0.0.0         255.255.252.0   U     103    0        0 em2
10.130.4.0       0.0.0.0         255.255.252.0   U     102    0        0 em1
192.168.1.0     0.0.0.0         255.255.255.0   U     300    0        0 bond0
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

安装数据库

加上参数 --install-cm表示同数据库一起安装cm,也可以单独部署。

ptk install -f config.2024-04-01T17_37_01.yaml  --install-cm -p MogDB-5.0.6-Kylin-x86_64-all.tar.gz


INFO[2024-04-22T16:21:59.149] PTK 版本: 1.4.1 release                        
INFO[2024-04-22T16:21:59.149] 从 config.2024-04-01T17_37_01.yaml 加载配置       
如果您选择继续安装软件,
就代表您接受该软件的许可协议。

  [Y]: 接受并继续
  [C]: 显示许可协议内容
  [N]: 中止安装并退出

✔ 请输入 (默认: Y): y
INFO[2024-04-22T16:22:00.884] CM 启用, 但 cm_servers 为空,默认使用数据库的服务器作为 CM 服务器  
集群将包含 2 个 CM 节点,所以请确认以下 cms 的配置:
- (Optional) db_service_vip=""
- (Required) third_party_gateway_ip="10.130.7.254,10.130.3.254"
- (Optional) cms_enable_failover_on2nodes="true"
- (Optional) cms_enable_db_crash_recovery="true"
✔ 请输入虚拟 IP (仅支持 IPv4): 10.130.4.6,10.130.0.6
现在这些配置的值是:
- db_service_vip="10.130.4.6,10.130.0.6"
- third_party_gateway_ip="10.130.7.254,10.130.3.254"
- cms_enable_failover_on2nodes="true"
- cms_enable_db_crash_recovery="true"
✔ 您想修改它们吗 (默认 n) [y/n]: n
集群名:"ats_cs"
+--------------+------------+----------------+----------+------------+-----------------------+----------+
| az(priority) |     ip     |  user(group)   |   port   |    role    |       data dir        | upstream |
+--------------+------------+----------------+----------+------------+-----------------------+----------+
| AZ1(1)       | 10.130.4.7  | omm506(omm506) | db:28000 | db:standby | db:/opt/mogdb506/data | -        |
|              |            |                | cm:15300 |            | cm:/opt/mogdb506/cm   |          |
|              | 10.130.4.5 | omm506(omm506) | db:28000 | db:primary | db:/opt/mogdb506/data | -        |

MogDB和CM安装完毕。

添加VIP

建议添加参数--log-level debug方便查看和分析报错。ptk会自动判断把vip挂载同网段的地址上,简单易用。

ptk cluster -n ats_cs load-cm-vip --vip 10.130.4.6 --action install  --log-level debug
ptk cluster -n ats_cs load-cm-vip --vip 10.130.0.6 --action install  --log-level debug

添加完后,会在 cd /opt/mogdb506/cm/cm_agent的下新增cm_resource.json的配置文件,"float_ip": "10.130.4.6","float_ip": "10.130.0.6"已经添加。

{
 "resources": [{
   "name""VIP_az996037",
   "resources_type""VIP",
   "instances": [{
     "node_id": 1,
     "res_instance_id": 6001,
     "inst_attr""base_ip=10.130.4.5"
    }, {
     "node_id": 2,
     "res_instance_id": 6002,
     "inst_attr""base_ip=10.130.4.7"
    }],
   "float_ip""10.130.4.6"
  }, {
   "name""VIP_az40655",
   "resources_type""VIP",
   "instances": [{
     "node_id": 1,
     "res_instance_id": 6001,
     "inst_attr""base_ip=10.130.0.5"
    }, {
     "node_id": 2,
     "res_instance_id": 6002,
     "inst_attr""base_ip=10.130.0.7"
    }],
   "float_ip""10.130.0.6"

cm_ctl show命令查看vip信息 vip:10.130.4.6挂载到10.130.4.5 ,vip:10.130.0.5挂载到10.130.0.6上面。

[omm506@mogdb1 cm_agent]$ cm_ctl show

[  Network Connect State  ]

Network timeout:       6s
Current CMServer time: 2024-04-22 18:29:06
Network stat('Y' means connected, otherwise 'N'):
|  \  |  Y  |
|  Y  |  \  |


[  Node Disk HB State  ]

Node disk hb timeout:    200s
Current CMServer time: 2024-04-22 18:29:07
Node disk hb stat('Y' means connected, otherwise 'N'):
|  N  |  N  |

[  FloatIp Network State  ]

node      instance base_ip    float_ip_name float_ip  
------------------------------------------------------
1  mogdb1 6001     10.130.4.5 VIP_az996037  10.130.4.6 
1  mogdb1 6001     10.130.0.5 VIP_az40655   10.130.0.6 

修改流复制ip

两台机器的postgresql.con都修改replconninfo[1-2]参数,如下。

replconninfo1 = 'localhost=192.168.1.100 localport=28001 localheartbeatport=26005 localservice=28004 remotehost=192.168.1.101 remoteport=28001 remoteheartbeatport=28005 remoteservice=28004'        
replconninfo2 = 'localhost=192.168.1.101 localport=28001 localheartbeatport=28005 localservice=28004 remotehost=192.168.1.100 remoteport=28001 remoteheartbeatport=28005 remoteservice=28004'         

修改pg_hba

添加互信,不然会出现Forbid remote connection with initia1 user的报错,添加#add MogDB那部分内容。

# "local" is for Unix domain socket connections only
local   all             all                                     trust
host    all    omm506    10.130.0.5/32    trust
host    all    omm506    10.130.4.5/32    trust
host    all    omm506    10.130.0.7/32    trust
host    all    omm506    10.130.4.7/32    trust

# add MogDB
host    all    omm506    192.168.1.101/32    trust
host    all    omm506    192.168.1.100/32    trust

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all    all    10.130.0.5/32    sha256
host    all    all    10.130.4.5/32    sha256
host    all    all    10.130.0.7/32    sha256
host    all    all    10.130.4.7/32    sha256

# add MogDB
host    all    all    192.168.1.101/32    sha256
host    all    all    192.168.1.100/32    sha256

host all all 10.130.4.6/32 sha256
host all all 10.130.0.6/32 sha256
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     omm506                                trust
#host    replication     omm506        127.0.0.1/32            trust
#host    replication     omm506        ::1/128                 trust

# add MogDB
host    all    all    0.0.0.0/0    md5

修改local_bind_address参数

设置为*。

vi /opt/mogdb506/data/postgresql.conf

local_bind_address = '*'

重启生效

这里能看到流复制通道为:192.168.1.100:28001-->192.168.1.101:56732,cm接管的为业务ip:10.130.4.5,10.130.0.5,10.130.4.7,10.130.0.7,大功告成。

[root@mogdb1 ~]# ptk cluster -n ats_cs status  --detail
[   Cluster State   ]
cluster_name                   : ats_cs
cluster_state                  : Normal
database_version               : MogDB 5.0.6 (build 8b0a6ca8)
active_vip                     : 10.130.4.6,10.130.0.6

[  CMServer State   ]
  id |          ip           | port  | hostname |  role    
-----+-----------------------+-------+----------+----------
  1  | 10.130.4.5,10.130.0.5 | 15300 | mogdb1   | primary  
  2  | 10.130.4.7,10.130.0.7   | 15300 | mogdb2   | standby  

[  Datanode State   ]
  cluster_name |  id  |     ip     | port  |  user  | nodename | db_role | state  |  uptime  | upstream  
---------------+------+------------+-------+--------+----------+---------+--------+----------+-----------
  ats_cs       | 6001 | 10.130.4.5 | 28000 | omm506 | dn_6001  | primary | Normal | 00:02:16 | -         
               |      | 10.130.0.5 |       |        |          |         |        |          |           
               | 6002 | 10.130.4.7  | 28000 | omm506 | dn_6002  | standby | Normal | 00:02:17 | -         
               |      | 10.130.0.7  |       |        |          |         |        |          |           

[  DataNode Detail  ]
--------------- 10.130.4.5:28000(dn_6001) ---------------
role                           : primary
data_dir                       : /opt/mogdb506/data
az_name                        : AZ1

[Senders Info]:

sender_pid                     : 3158066
local_role                     : Primary
peer_role                      : Standby
peer_state                     : Normal
state                          : Streaming
sender_sent_location           : 0/5E95998
sender_write_location          : 0/5E95998
sender_flush_location          : 0/5E95998
sender_replay_location         : 0/5E95998
receiver_received_location     : 0/5E95998
receiver_write_location        : 0/5E95998
receiver_flush_location        : 0/5E95998
receiver_replay_location       : 0/5E95998
sync_percent                   : 100%
sync_state                     : Sync
sync_priority                  : 1
sync_most_available            : On
channel                        : 192.168.1.100:28001-->192.168.1.101:56732

--------------- 10.130.4.7:28000(dn_6002) ---------------
role                           : standby
data_dir                       : /opt/mogdb506/data
az_name                        : AZ1

[Receiver Info]:

receiver_pid                   : 3121372
local_role                     : Standby
peer_role                      : Primary
peer_state                     : Normal
state                          : Normal
sender_sent_location           : 0/5E95AB8
sender_write_location          : 0/5E95AB8
sender_flush_location          : 0/5E95AB8
sender_replay_location         : 0/5E95AB8
receiver_received_location     : 0/5E95AB8
receiver_write_location        : 0/5E95AB8
receiver_flush_location        : 0/5E95AB8
receiver_replay_location       : 0/5E95AB8
sync_percent,channel           : 100%

CM双网高可用测试

测试场景:

    1. 备库单网卡故障
    1. 主库A网卡故障
    1. 主库B网卡故障

预期:

    1. 无影响,不影响主备同步,不影响业务
    1. 主库A网故障,无影响,不影响主备同步,不影响业务
    1. 主库B网故障,进行主备切换,备库升主(switchover)

备库业务单网故障

[root@mogdb2 dn_6002]# ifdown em2
WARN      : [ifdown] 您正在使用由 ‘network-scripts’ 所提供的 ‘ifdown’,这一命令现在不推荐使用。
WARN      : [ifdown] ‘network-scripts’ 将在不久的将来的发行版中被移除。
WARN      : [ifdown] 建议切换到 ‘NetworkManager’ 作为代替,它也提供了 ‘ifup/ifdown’ 脚本。

[root@mogdb1 ~]# ptk cluster -n ats_cs status  --detail
[   Cluster State   ]
cluster_name                   : ats_cs
cluster_state                  : Normal
database_version               : MogDB 5.0.6 (build 8b0a6ca8)
active_vip                     : 10.130.4.6,10.130.0.6

[  CMServer State   ]
  id |          ip           | port  | hostname |  role    
-----+-----------------------+-------+----------+----------
  1  | 10.130.4.5,10.130.0.5 | 15300 | mogdb1   | primary  
  2  | 10.130.4.7,10.130.0.7   | 15300 | mogdb2   | standby  

[  Datanode State   ]
  cluster_name |  id  |     ip     | port  |  user  | nodename | db_role | state  |  uptime  | upstream  
---------------+------+------------+-------+--------+----------+---------+--------+----------+-----------
  ats_cs       | 6001 | 10.130.4.5 | 28000 | omm506 | dn_6001  | primary | Normal | 00:03:16 | -         
               |      | 10.130.0.5 |       |        |          |         |        |          |           
               | 6002 | 10.130.4.7  | 28000 | omm506 | dn_6002  | standby | Normal | 00:03:17 | -         
               |      | 10.130.0.7  |       |        |          |         |        |          |           

[  DataNode Detail  ]
--------------- 10.130.4.5:28000(dn_6001) ---------------
role                           : primary
data_dir                       : /opt/mogdb506/data
az_name                        : AZ1

[Senders Info]:

sender_pid                     : 3158066
local_role                     : Primary
peer_role                      : Standby
peer_state                     : Normal
state                          : Streaming
sender_sent_location           : 0/5E95998
sender_write_location          : 0/5E95998
sender_flush_location          : 0/5E95998
sender_replay_location         : 0/5E95998
receiver_received_location     : 0/5E95998
receiver_write_location        : 0/5E95998
receiver_flush_location        : 0/5E95998
receiver_replay_location       : 0/5E95998
sync_percent                   : 100%
sync_state                     : Sync
sync_priority                  : 1
sync_most_available            : On
channel                        : 192.168.1.100:28001-->192.168.1.101:56732

--------------- 10.130.4.7:28000(dn_6002) ---------------
role                           : standby
data_dir                       : /opt/mogdb506/data
az_name                        : AZ1

[Receiver Info]:

receiver_pid                   : 3121372
local_role                     : Standby
peer_role                      : Primary
peer_state                     : Normal
state                          : Normal
sender_sent_location           : 0/5E95AB8
sender_write_location          : 0/5E95AB8
sender_flush_location          : 0/5E95AB8
sender_replay_location         : 0/5E95AB8
receiver_received_location     : 0/5E95AB8
receiver_write_location        : 0/5E95AB8
receiver_flush_location        : 0/5E95AB8
receiver_replay_location       : 0/5E95AB8
sync_percent,channel           : 100%

无影响,不影响主备同步,不影响业务,集群一切正常。

主库A网故障

down掉A网。

[root@mogdb1 ~]# ifdown em1
WARN      : [ifdown] 您正在使用由 ‘network-scripts’ 所提供的 ‘ifdown’,这一命令现在不推荐使用。
WARN      : [ifdown] ‘network-scripts’ 将在不久的将来的发行版中被移除。
WARN      : [ifdown] 建议切换到 ‘NetworkManager’ 作为代替,它也提供了 ‘ifup/ifdown’ 脚本。

数据库同步正常

[2024-04-23 19:44:12.469][944266][][gs_ctl]: gs_ctl query ,datadir is /opt/mogdb506/data 
 HA state:           
 local_role                     : Primary
 static_connections             : 2
 db_state                       : Normal
 detail_information             : Normal

 Senders info:       
 sender_pid                     : 226949
 local_role                     : Primary
 peer_role                      : Standby
 peer_state                     : Normal
 state                          : Streaming
 sender_sent_location           : 0/A1575E8
 sender_write_location          : 0/A1575E8
 sender_flush_location          : 0/A1575E8
 sender_replay_location         : 0/A1575E8
 receiver_received_location     : 0/A1575E8
 receiver_write_location        : 0/A1575E8
 receiver_flush_location        : 0/A1575E8
 receiver_replay_location       : 0/A1575E8
 sync_percent                   : 100%
 sync_state                     : Sync
 sync_priority                  : 1
 sync_most_available            : On
 channel                        : 192.168.1.100:28001-->192.168.1.101:41842

 Receiver info:      
No information 

主库B网故障

down掉B网。

[root@mogdb1 ~]#  ifdown em2
WARN      : [ifdown] 您正在使用由 ‘network-scripts’ 所提供的 ‘ifdown’,这一命令现在不推荐使用。
WARN      : [ifdown] ‘network-scripts’ 将在不久的将来的发行版中被移除。
WARN      : [ifdown] 建议切换到 ‘NetworkManager’ 作为代替,它也提供了 ‘ifup/ifdown’ 脚本。
成功断开设备 "em2"

主库数据库被cm关闭。

[omm506@mogdb1 ~]$ cm_ctl query -Cvi
[  CMServer State   ]

node      node_ip                         instance state
----------------------------------------------------------
cm_ctl: [DoConnCmserver] ip 10.130.4.5 is not reachable.
cm_ctl: [DoConnCmserver] ip 10.130.0.5 is not reachable.
cm_ctl: [DoConnCmserver] ip 10.130.4.7 is not reachable.
cm_ctl: [DoConnCmserver] ip 10.130.0.7 is not reachable.
1  mogdb1 10.130.4.5,10.130.0.5           1        Down
2  mogdb2 10.130.4.7,10.130.0.7             2        Down

cm_ctl: can't connect to cm_server.
Maybe cm_server is not running, or timeout expired. Please try again.

主库数据库被cm关闭。

[omm506@mogdb1 ~]$ ps -ef |grep mogdb
pcp         2823       1  0 19:27 ?        00:00:00 /usr/bin/pmie -b -h local: -l /var/log/pcp/pmie/mogdb1/pmie.log -c config.default
omm506      8941       1  0 19:28 ?        00:00:05 /opt/mogdb506/app/bin/om_monitor -L /opt/mogdb506/log/cm/om_monitor
omm506      8945    8941  5 19:28 ?        00:01:18 /opt/mogdb506/app/bin/cm_agent
omm506      8988       1  0 19:28 ?        00:00:00 mogdb fenced UDF master process
omm506   1115099 1114674  0 19:51 pts/1    00:00:00 grep mogdb
[omm506@mogdb1 ~]$ gsql -r 
failed to connect /opt/mogdb506/tmp:28000.

cm_ctl query -Cvi查看集群状态,可以看出备库已经是Primary Normal,已经升主。

[  CMServer State   ]

node      node_ip                         instance state
----------------------------------------------------------
cm_ctl: [DoConnCmserver] ip 10.130.4.5 is not reachable.
cm_ctl: [DoConnCmserver] ip 10.130.0.5 is not reachable.
1  mogdb1 10.130.4.5,10.130.0.5           1        Down
2  mogdb2 10.130.4.7,10.130.0.7             2        Primary

[   Cluster State   ]

cluster_state   : Degraded
redistributing  : No
balanced        : No
current_az      : AZ_ALL

[  Datanode State   ]

node      node_ip                         instance state            | node      node_ip                         instance state
--------------------------------------------------------------------------------------------------------------------------------------------
1  mogdb1 10.130.4.5,10.130.0.5           6001     P Down    Unknown | 2  mogdb2 10.130.4.7,10.130.0.7             6002     S Primary Normal

cm_ctl show查看vip状态,全部漂移到mogdb2的A和B网上,对业务透明无感知。

[omm506@mogdb2 ~]$ cm_ctl show
cm_ctl: [DoConnCmserver] ip 10.130.4.5 is not reachable.
cm_ctl: [DoConnCmserver] ip 10.130.0.5 is not reachable.

[  Network Connect State  ]

Network timeout:       6s
Current CMServer time: 2024-04-23 19:52:21
Network stat('Y' means connected, otherwise 'N'):
|  \  |  N  |
|  N  |  \  |


[  Node Disk HB State  ]

Node disk hb timeout:    200s
Current CMServer time: 2024-04-23 19:52:22
Node disk hb stat('Y' means connected, otherwise 'N'):
|  N  |  N  |

[  FloatIp Network State  ]

node      instance base_ip    float_ip_name float_ip  
------------------------------------------------------
2  mogdb2 6002     10.130.4.7  VIP_az996037  10.130.4.6 

总结

MogDB 5.0.6特性CM支持双网段,在某个节点在发生单网段故障后仍然能保证正常工作,提供网段级故障的高可用管理能力。Mogdb首先实现了对Oracle传统双网方案的兼容,并且为保证双网方案具有较好的业务切换体验,还实现了IT环境解耦,持续稳定支撑核心系统。

作者介绍:云和恩墨资深Oracle dba,专注于数据库运维、架构和行业发展,有12年左右的金融、保险、政府、地税、运营商等业务关键型系统的运维经验,曾担任公司异常恢复东区接口人,负责紧急异常恢复工作,技术二线专家。目前负责PG、openGauss/MogDB运维、国产化MogDB数据库的推广工作。

  • 71
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值